J'ai besoin d'une implémentation de fonction de hachage orientée vers la performance en C++ pour une table de hachage que je vais coder. J'ai déjà regardé autour de moi et je n'ai trouvé que des questions demandant ce qu'est une bonne fonction de hachage "en général". J'ai envisagé le CRC32 (mais où trouver une bonne implémentation ?) et quelques algorithmes de cryptographie. Ma table, cependant, a des exigences très spécifiques.
Voici à quoi ressemblera la table :
100,000 items max
200,000 capacity (so the load is 0.5)
hashing a 6-character string which is a part of English sentence
examples: "become" "and he" ", not "
El priorité numéro un de ma table de hachage est la recherche rapide (retrieval). L'insertion rapide n'est pas importante, mais elle viendra avec la recherche rapide. L'effacement n'est pas important, et le re-hachage n'est pas quelque chose que j'envisage. Pour gérer les collisions, je vais probablement utiliser chaînage séparé comme décrit aquí . J'ai déjà regardé cet article mais j'aimerais avoir l'avis de ceux qui ont déjà accompli une telle tâche.
0 votes
J'ai également ajouté une fonction de hachage que vous pourriez apprécier comme autre réponse
0 votes
Si vous êtes désespéré, pourquoi n'avez-vous pas mis une prime de repérage sur cette affaire ?
0 votes
Rep bounty : je l'aurais mis si personne ne voulait offrir des suggestions utiles, mais je suis agréablement surpris :)
0 votes
Quoi qu'il en soit, un problème avec les primes est que vous ne pouvez pas placer des primes avant que 2 jours se soient écoulés.
22 votes
Avez-vous envisagé d'utiliser une ou plusieurs des fonctions de hachage d'usage général suivantes : partow.net/programming/hashfunctions/index.html ils sont extrêmement rapides et efficaces.
0 votes
Est-ce que vous sûr que les performances de la fonction de hachage sont critiques ? Les fonctions populaires consistent à faire tourner un
unsigned int
par, disons 3 bits et ajouter dans l'octet suivant, puis réduire modulo un nombre premier, celui-là fonctionne bien pour le texte. L'entrée est-elle, d'une manière ou d'une autre, sous le contrôle (partiel) de parties potentiellement malveillantes (elles pourraient vous donner 100 000 chaînes de caractères dont le hachage est limité à quelques buckets...) ? Dans ce cas, vous devez faire en sorte qu'il soit difficile de préparer des données pour une telle attaque, peut-être en "salant" (commencer avec une valeur aléatoire secrète pour chaque table) et en ajoutant un hachage cryptographique (mais pour les chaînes courtes, cela peut ne pas être très efficace).