web-dev-qa-db-fra.com

Vous cherchez une bonne implémentation de table de hachage en C

Je suis principalement intéressé par les clés de chaîne. Quelqu'un peut-il me diriger vers une bibliothèque?

67
SetJmp

J'ai eu le même besoin et j'ai fait des recherches et j'ai fini par utiliser libcf

C'est simple et lisible donc si j'ai un besoin de modification, je peux le faire sans trop de temps pour comprendre. Il s'agit également d'une licence BSD. Pas besoin de changer mes structures (pour incorporer disons un prochain pointeur)

J'ai dû rejeter les autres options pour les raisons suivantes (mes raisons personnelles, YMMV):

  • sglib -> c'est un labyrinthe de macros et je n'étais pas à l'aise pour déboguer/apporter des modifications sur une telle base de code en utilisant uniquement des macros
  • cbfalconer -> beaucoup de fanions de licence, et le site était en panne et trop de discussions défavorables sur le Web concernant le support/l'auteur; ne voulait pas prendre le risque
  • google sparce-hash -> comme indiqué déjà, c'est pour C++, pas C
  • glib (gnome hash) -> avait l'air très prometteur; mais je n'ai pas trouvé de moyen facile d'installer le kit de développement; J'avais juste besoin des routines/fichiers C - pas de l'environnement de développement complet
  • Judy -> semble trop complexe pour une utilisation simple .. n'était pas non plus prêt à me déboguer si je devais rencontrer des problèmes
  • npsml (mentionné ici) -> ne peut pas trouver la source
  • strmap trouvé très simple et utile - c'est tout simplement trop simpliste que la clé et la valeur doivent être des chaînes; la valeur étant une chaîne semble trop restrictive (devrait accepter void *)
  • thash -> semble bon (a été mentionné sur wikipedia sur la table de hachage); a constaté qu'il fallait modifier la structure - je ne voulais pas le faire car la performance n'est pas vraiment un problème pour mon utilisation - c'est plus la vitesse de développement.

En résumé, pour une utilisation très simple, strmap est bon; uthash si vous êtes préoccupé par l'utilisation de mémoire supplémentaire. Si seule la vitesse de développement ou la facilité d'utilisation est l'objectif principal, libcfu gagne [note que libcfu fait en interne l'allocation de mémoire pour maintenir les nœuds/tables de hachage]. Il est surprenant qu'il n'y ait pas beaucoup d'implémentations de hachage C simples disponibles.

56
Karthik Gurusamy

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)

16
Daniel M

Pour les chaînes, le Judy Array pourrait être bon.

Un tableau Judy est une structure de données de tableau associatif 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 Judy peuvent être clairsemés; c'est-à-dire qu'ils peuvent avoir de larges plages d'indices non attribués.

Voici une bibliothèque Judy dans [~ # ~] c [~ # ~] .

Une bibliothèque C qui fournit une technologie de base de pointe qui implémente une matrice dynamique clairsemée. Les tableaux Judy sont déclarés simplement avec un pointeur nul. Une baie Judy ne consomme de la mémoire que lorsqu'elle est remplie, mais peut évoluer pour profiter de toute la mémoire disponible si vous le souhaitez.


Autres références,
Ce référence d'implémentation de hachage Wikipedia a quelques C liens open source.
En outre, cmph - Une bibliothèque de hachage parfaite minimale dans C, prend en charge plusieurs algorithmes.

8
nik

Un long moment s'est écoulé depuis que j'ai posé cette question ... Je peux maintenant ajouter ma propre bibliothèque du domaine public à la liste:

http://sourceforge.net/projects/npsml/

5
SetJmp

Interfaces et implémentations C de Dave Hanson comprend une table de hachage fine et plusieurs autres structures de données bien conçues. Il y a aussi une belle interface de traitement des chaînes. 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.

5
Norman Ramsey
5
Nick Van Brunt

C Interfaces et implémentations traite des implémentations de table 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.)

4
sblair

La bibliothèque APR d'Apache a sa propre hash-implementation . Il est déjà porté sur tout ce sur quoi Apache s'exécute et la licence Apache est également assez libérale.

3
Mikhail T.
3
alex

Je ne l'ai jamais utilisé mais Google Sparsehash peut fonctionner

2
Nick

Téléchargez tcl et utilisez leur fonction de hachage tcl éprouvée. C'est facile. L'API TCL est bien documentée.

2
xcramps

Gperf - Générateur de fonctions de hachage parfait

http://www.ibm.com/developerworks/linux/library/l-gperf.html

0
joe