Quel est le meilleur 32bit fonction de hachage pour de courtes chaînes de caractères (noms de balise)?
Quel est le meilleur 32bit fonction de hachage pour relativement courtes chaînes?
Les chaînes de caractères sont des noms de balises qui consistent en anglais des lettres, des chiffres, des espaces et des caractères supplémentaires (#
, $
, .
, ...). Par exemple: Unit testing
, C# 2.0
.
Je suis à la recherche pour le "meilleur", comme dans "minime collisions', la performance n'est pas important pour mes objectifs.
- possible en double stackoverflow.com/questions/251346/...
- Pas complètement, parce que ma question est plus précise en termes de hachage de taille et ignore les performances. Aussi, je ne suis pas à la recherche d'une fonction de hachage, je suis à la recherche d'un bon choix -- je sais qu'il y a CRC32 et FNV32, mais ce qui est le mieux pour mon nom de domaine?
- Est votre liste de balises fixes à un ensemble de chaînes ou elle va se développer de manière dynamique au fil du temps?
- Les balises sont ajoutés par des gens donc je ne peux pas prévoir (mais il y a de la longueur et de la limite de caractères).
- Quelles sont les limites?
- Longueur Max: 20, jeu de caractères actuel:
[A-Za-z\d\.#$@\-\ ]
(ce qui peut augmenter légèrement si je constate que certains symbole fort utile, je l'ai raté). - La page suivante a plusieurs implémentations de l'objectif général des fonctions de hachage qui sont efficaces et d'exposition minimale des collisions: partow.net/programming/hashfunctions/index.html
Vous devez vous connecter pour publier un commentaire.
Si la performance n'est pas important, il suffit de prendre un secure hash comme MD5 ou SHA1, et de tronquer sa sortie de 32 bits. Cela vous donnera une distribution de codes de hachage qui est indiscernable de hasard.
Je ne suis pas sûr si c'est le meilleur choix, mais ici, c'est une fonction de hachage pour les chaînes:
la Pratique de La Programmation (TABLES de HACHAGE, pg. 57)
Je suis désolé pour la réponse tardive sur ce. Plus tôt cette année, j'ai composé une page intitulée Le Hachage Des Chaînes Courtes qui pourrait être utile dans cette discussion. En résumé, j'ai trouvé que la CRC-32 et de la FNV-1a sont de qualité supérieure pour le hachage des chaînes courtes. Ils sont efficaces et produit largement diffusé et libre de collision hachages dans mes tests. J'ai été surpris de constater que MD5, SHA-1 et SHA-3 produit un petit nombre de collisions lorsque la sortie a été plié à 32 bits.
Vous pouvez vérifier murmurhash2. Il est rapide, même pour les petites chaînes, et a un bon mélange de l'étape finale, de sorte qu'il est encore bon mixte pour les très petites chaînes.
Qui dépend de votre matériel.
Sur le matériel moderne, c'est à dire Intel/AMD avec SSE4.2 ou arm7 vous devez utiliser l'interne
_mm_crc32_uxx
intrinsèques, comme ils le sont optimales pour des chaînes courtes. (Pour les longues touches aussi, mais alors mieux utiliser Adler version filetée, comme dans zlib)Sur de vieux ou inconnu matériel, soit au moment de l'exécution de la sonde pour le SSE4.2 ou CRC32 de fonctionnalité ou d'utiliser un seul si le simple bon de fonctions de hachage. E. g. Murmur2 ou de la Ville
Un aperçu de la qualité et de la performance est ici:
https://github.com/rurban/smhasher#smhasher
Il y a aussi toutes les implémentations. Favorisée sont https://github.com/rurban/smhasher/blob/master/crc32_hw.c et https://github.com/rurban/smhasher/blob/master/MurmurHash2.cpp
Si vous connaissez les clés à l'avance, utiliser un parfait de hachage, pas une fonction de hachage. E. g. gperf ou mon phash: https://github.com/rurban/Perfect-Hash#name
Aujourd'hui de hachage parfait génération via un compilateur c est si rapide, vous pouvez même créer à la volée, et dynaload il.
Si c'est rare que les utilisateurs d'ajouter de nouvelles balises, vous pouvez utiliser un parfait hachage (http://en.wikipedia.org/wiki/Perfect_hash_function) c'est recalculée chaque fois qu'un nouveau tag est ajouté. Bien sûr, sans connaître le problème que vous êtes vraiment essayer de résoudre, c'est la conjecture de comprendre ce que vous pourriez faire.
Utilisation MaPrime2c fonction de hachage:
et de regarder http://www.amsoftware.narod.ru/algo2.html pour MaFastPrime, MaRushPrime, etc tests.
Si votre programme a besoin de communiquer avec d'autres système, il est préférable d'utiliser un algorithme qui est bien connue. Le quick & sale est à l'aide de premiers caractères de hachage md5. Vous n'avez pas besoin de passer des heures ou des jours pour inventer des roues de votre projet.
L'inconvénient est d'obtenir beaucoup beaucoup plus grande chance de collisions. Toutefois, si votre valeur de hachage est pour un horodatage de la session, ou courte vie circulates la tâche. Il n'y a pas de problème pour l'utiliser.