Je m’intéresse principalement aux clés à cordes. Quelqu’un peut-il me diriger vers une bibliothèque?
J’ai eu le même besoin et fait des recherches et j’ai fini par utiliser libcfu
C’est simple et lisible, donc si j’ai besoin de modifier, je peux le faire sans passer trop de temps à comprendre. C’est aussi de la licence BSD. Pas besoin de changer mes structures (pour intégrer un pointeur suivant)
J’ai dû rejeter les autres options pour les raisons suivantes (mes raisons personnelles, YMMV):
En résumé pour une utilisation très simple, strmap est bien; uthash si vous êtes concerné par l’utilisation de mémoire supplémentaire. Si la rapidité de développement ou la facilité d’utilisation sont les objectives principaux, libcfu gagne [notez que libcfu effectue en interne une allocation de mémoire pour maintenir les nœuds / hashtables]. Il est surprenant qu’il n’y ait pas beaucoup d’implémentations simples de hash C disponibles.
GLib est une excellente bibliothèque à utiliser comme base dans vos projets C. Ils ont des offres de structure de données décentes, y compris des tables de hachage: http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html (lien mis à jour le 4/6/2011)
Pour les cordes, le Judy Array pourrait être bon.
Un tableau Judy est une structure de données associative complexe mais très rapide pour stocker et rechercher des valeurs à l’aide de clés entières ou de chaînes. Contrairement aux tableaux normaux, les tableaux de Judy peuvent être rares; c’est-à-dire qu’ils peuvent avoir de grandes plages d’indices non atsortingbués.
Voici une bibliothèque Judy en C.
Bibliothèque AC qui fournit une technologie de base à la pointe de la technologie qui implémente un tableau dynamic fragmenté. Les tableaux de Judy sont déclarés simplement avec un pointeur nul. Un tableau Judy ne consum de la mémoire que lorsqu’il est rempli, mais peut évoluer pour tirer parti de toute la mémoire disponible si vous le souhaitez.
Autres références,
Cette référence d’implémentation de hachage Wikipedia contient des liens C
open source.
De plus, cmph – Une bibliothèque de hachage parfaite minimale en C
, supporte plusieurs algorithmes.
Il y a quelques bonnes réponses ici:
Classe de conteneur / bibliothèque pour C
http://sglib.sourceforge.net .
http://cbfalconer.home.att.net/download/
Les interfaces et implémentations C de Dave Hanson incluent une table de hachage fine et plusieurs autres structures de données bien conçues. Il y a aussi une belle interface de traitement de chaîne. Le livre est génial si vous pouvez vous le permettre, mais même si ce n’est pas le cas, j’ai trouvé ce logiciel très bien conçu, assez petit pour apprendre dans son intégralité et facile à réutiliser dans plusieurs projets différents.
Il y a longtemps que j’ai posé cette question … Je peux maintenant append ma propre bibliothèque de domaine public à la liste:
C Interfaces et implémentations discute des implémentations de tables de hachage en C. Le code source est disponible en ligne . (Ma copie du livre est au travail donc je ne peux pas être plus précis.)
La bibliothèque APR d’Apache a sa propre implémentation de hachage . Il est déjà porté sur tout ce qui est exécuté par Apache et la licence Apache est plutôt libérale.
khash.h de samtools / bwa / seqtk / klib
curl https://raw.github.com/attractivechaos/klib/master/khash.h
Je ne l’ ai jamais utilisé mais Google Sparsehash peut fonctionner
Téléchargez tcl et utilisez leur fonction de hachage tcl éprouvée. C’est facile. L’API TCL est bien documentée.
Gperf – Générateur de fonctions de hachage parfait
http://www.ibm.com/developerworks/linux/library/l-gperf.html
http://www.cl.cam.ac.uk/~cwc22/hashtable/
Fonctions définies
* create_hashtable * hashtable_insert * hashtable_search * hashtable_remove * hashtable_count * hashtable_destroy
Exemple d’utilisation
struct hashtable *h; struct some_key *k; struct some_value *v; static unsigned int hash_from_key_fn( void *k ); static int keys_equal_fn ( void *key1, void *key2 ); h = create_hashtable(16, hash_from_key_fn, keys_equal_fn); insert_key = (struct some_key *) malloc(sizeof(struct some_key)); resortingeve_key = (struct some_key *) malloc(sizeof(struct some_key)); v = (struct some_value *) malloc(sizeof(struct some_value)); (You should initialise insert_key, resortingeve_key and v here) if (! hashtable_insert(h,insert_key,v) ) { exit(-1); } if (NULL == (found = hashtable_search(h,resortingeve_key) )) { printf("not found!"); } if (NULL == (found = hashtable_remove(h,resortingeve_key) )) { printf("Not found\n"); } hashtable_destroy(h,1); /* second arg indicates "free(value)" */
stl a map et hash_map (hash_map est seulement dans certaines implémentations) qui sont la clé de la valeur si vous pouvez utiliser C ++.