Je travaille sur une table de hachage en langage C et je teste la fonction de hachage pour les chaînes de caractères.
La première fonction que j'ai essayée est d'ajouter du code ascii et d'utiliser le modulo (%100) mais j'ai obtenu de mauvais résultats avec le premier test de données : 40 collisions pour 130 mots.
Les données d'entrée finales contiendront 8 000 mots (il s'agit d'un dictionnaire stocké dans un fichier). La table de hachage est déclarée comme int table[10000] et contient la position du mot dans un fichier txt.
La première question est la suivante : quel est le meilleur algorithme pour hacher une chaîne de caractères ? et comment déterminer la taille de la table de hachage ?
- Merci d'avance !
-)
11 votes
Si votre table de hachage a 10K entrées, pourquoi utiliseriez-vous le modulo 100 ? Obtenir 40 collisions sur 130 mots n'est pas surprenant avec un si petit modulo.
0 votes
Il existe de nombreuses implémentations de hachage de chaînes de caractères disponibles sur Google et SO (lire : il faut continuer à chercher). De nombreuses approches utilisent un "barrel shift" ou un "rolling" hash (éventuellement avec des phases de "mixing") -- mais tenez compte de Gregory !
14 votes
Ver burtleburtle.net/bob/hash/evahash.html y partow.net/programmation/hashfunctions pour lequel on trouve des ressources sur les différents hachages (du général au cryptographique en passant par les chaînes).
4 votes
Pour clarifier @CareyGregory : Vous réalisez qu'en tant que vérité mathématique de base, 130 éléments dans 100 seaux (c'est-à-dire mod 100) doivent produire 30 collisions (où la collision est comptée comme chaque fois qu'un deuxième, troisième, etc. élément est mis dans un seau), correct ? Vous n'êtes donc qu'un peu au-dessus de ce chiffre.
0 votes
@derobert : Oui, un minimum de 30 collisions. Mais ce n'est pas ma question. L'OP déclare que la table de hachage a 10K entrées. Alors pourquoi un modulus de 100 ? Sauf si j'ai mal compris ce que lilawood voulait dire, cela laisserait 9900 entrées inutilisables dans la table de hachage.
0 votes
@CareyGregory : Je pense que c'est la version de 8 000 mots qui utilise le hachage de 10 000 entrées - heureusement avec un module plus élevé. Je suppose que la version de 130 mots (avec le module 100) est un problème de taille réduite pour faciliter le débogage, etc. Cette précision s'adresse à lilawood, pour expliquer pourquoi (comme vous l'avez commenté) 40 collisions n'est pas surprenant.
0 votes
Je n'ai essayé qu'une petite partie des données d'entrée pour tester l'algorithme comme l'a dit @derobert.
4 votes
@lilawood : OK, c'est ce que je pensais, mais pour être un meilleur test, vous devriez utiliser 80 mots avec une table de hachage de 100 entrées. Cela vous donnerait les mêmes proportions que vos données en direct et ne forcerait pas les collisions.
4 votes
Duplicata possible de Bonne fonction de hachage pour les chaînes de caractères
0 votes
Les meilleures réponses à cette question peuvent être trouvées sur un autre site de stackexchange : softwareengineering.stackexchange.com/questions/49550/