Chaîne Simple fonction de hachage
Je suis en train de hash d'une chaîne en un entier pour le placer dans un tableau. Cependant, je ne sais pas trop beaucoup sur les fonctions de hachage, et c'est pourquoi ma méthode actuelle est de simplement ajouter tous les nombres ASCII des caractères en commun et de la prise de mod la taille de la matrice.
Sont là, toute simple, plus rapide/de meilleures méthodes?
Quelle langue utilisez-vous?
Êtes-vous essayer de faire une table de hachage?
Double de la moitié de l'.
Je suis à l'aide de Delphi pour le moment
Est-il un wiki de la communauté sur des fonctions de hachage? Si non, probablement il est logique de commencer, avec des informations structurées par les types d'entrée, les performances et les implémentations de langue.
Êtes-vous essayer de faire une table de hachage?
Double de la moitié de l'.
Je suis à l'aide de Delphi pour le moment
Est-il un wiki de la communauté sur des fonctions de hachage? Si non, probablement il est logique de commencer, avec des informations structurées par les types d'entrée, les performances et les implémentations de langue.
OriginalL'auteur Hal | 2010-09-11
Vous devez vous connecter pour publier un commentaire.
La FNV-1a de hachage est rapide et facile à mettre en œuvre.
+1. FNV entrée de Wikipedia beats que l'un des Jenkins. Et la langue agnostique.
Uniquement parce qu'ils ont omis l'avalanche de résultats. Il s'avère que FNV-1a ne suce pas, mais FNV. Pour cette question, Jenkins lookup3 est ok, alors que son un-à-un-temps suce.
Je doute que vous vous souciez de votre rep score plus que je fais, mais si vous modifier votre réponse à spécifier FNV-1a, alors je suis heureux de supprimer le downvote. Je ne l'aime toujours pas ce FNV variante, mais au moins c'est pas terrible.
la Comparaison de la FNV-1, FNV-1a, DJB2, DJB2a, choisi parmi sdbm, CRC32. De ces FNV-1a est le meilleur.
OriginalL'auteur Greg Hewgill
Voir http://www.strchr.com/hash_functions pour un très bon panel de fonctions de hachage.
En Delphi mise en œuvre, voici plusieurs versions:
Le premier à venir à l'esprit est celui utilisé dans les
TStringHash.HashOf
méthode officielleIniFiles.pas
unité. Y compris les plus rapides de l'asm version:Le classique Kernighan &Ritchie de hachage à partir de "The C programming Language", 3e édition - pas le meilleur, mais simple et efficace du code.
Le rapide "Adler" CRC mises en œuvre dans la zlib - optimisé asm version ici:
Ma propre variante plus rapide - pas de ré-entrant, mais plus rapide car il sera lu par DWORDs - et encore plus asm version ici:
Le classique CRC32 de version, vous pouvez trouver une très optimisé asm version (à l'aide de 8 tables) ici:
Sur une comparaison de fonctions de hachage, prendre un coup d'oeil à delphitools.info/2014/08/25/string-hashing-shootout En bref: crc32 est le meilleur équilibre entre les performances et les collisions, kr32 a beaucoup de collisions, et BobJenkinsHash est très lente.
OriginalL'auteur Arnaud Bouchez
Comme Dummy00001 souligné, ce qui a été demandé et répondu avant. Jetez un oeil à Meilleur algorithme de hachage nombre de valeurs?, en particulier la suggestion de l'utilisation de MurmurHash.
Je le recommande MurmurHash parce que:
Il est très rapide.
De sa distribution et l'avalanche caractéristiques sont excellents pour un non de hachage cryptographique.
Son pire des cas, le comportement est toujours très bon.
Je l'ai utilisé. Il ne suce pas.
modifier
Il y avait beaucoup de discussion sur la meilleure façon de port à Delphes, sur https://forums.embarcadero.com/thread.jspa?threadID=13902&tstart=0. Le code résultant est disponible à https://forums.codegear.com/thread.jspa?threadID=14879
Delphi traduction
Passe tous auto-tests à partir de l'original C mise en œuvre.
J'ai répondu à cet ailleurs, mais je vais le répéter ici: sites.google.com/site/murmurhash/avalanche
Après que vous avez regardé, retirez le downvote.
Certaines personnes pourraient penser que, puisque la source est le canonique site pour MurmurHash, il doit être suspect. Ces personnes devraient lire plus attentivement et suivez le lien vers home.comcast.net/~bretm/hachage
concernant le lien - 404 erreurs lorsque vous essayez de regarder dans les diagrammes à le lien. Ni vous avez fourni un lien vers l'exemple de la mise en œuvre de processus annoncés algorithme. P. S. le second lien (~bretm) indique les différentes avalanche diagramme de Jenkins et la conclusion est aussi agréable: "Cette fonction de hachage par Bob Jenkins devrait être adapté pour un usage général, que ce soit pour une table de hachage de recherche, de fichier de base d'empreintes digitales, ou d'autres non cryptographique utilise." Vous êtes très confiance source de l'information 😉
OriginalL'auteur Steven Sudit
Jenkins fonction de hachage devrait vous aider à obtenir commencé.
Vous jetez importante de l'information qui est la position du caractère dans la chaîne. C'est une mauvaise idée, depuis les chaînes de "AB" et "BA" aurait même la même valeur de hachage.
Au lieu de plus simple, maintien de la primitive, on peut utiliser l'expression comme
hash = hash*P1 + str[i]*P2 + P3;
où Pi sont quelques-uns des nombres premiers. C'est comment je fais si j'ai besoin d'une fonction de hachage rapidement. J'utilise souvent de 7, 5 et 3, comme les nombres premiers, mais les chiffres doivent évidemment être ajusté (ainsi que la valeur initiale dehash
), de sorte que le résultat de la fonction de hachage est utilisable pour votre tâche.Pour plus d'informations lire le correspondant (et plutôt instructif) article de Wikipédia.
Les points jaunes sont vraiment il y en a peu. Et c'est certainement mieux que la simple addition. Et il est rapide et fonctionne très bien sur le monde réel des chaînes de caractères. Je l'utilise dans plusieurs endroits et il a certainement amélioré la distribution des clés.
Je ne nie pas un instant que c'est mieux que plus -- j'ai même souligné l'AB/BA problème dans un commentaire à la réponse qui a été supprimé. Cependant, il n'y a pas de raison, il devrait y avoir aucun jaune pixels. Des projets comme memcachedb utilisation Murmure pour une bonne raison!
Ne soyez pas stupide. Il y aurait toujours jaune pixels - parce que l'on a encore à appliquer le modulo pour le résultat de la fonction de hachage et qui serait jeter plus d'informations utiles. Et murmure ne semblent pas être très différente de Jenkins ou de la FNV. Ou que vous n'avez même pas pris la peine de vérifier comment le Murmure des œuvres? Je pense que vous êtes trop pédant ici.
Oh, je suis certainement pédant, mais je suis aussi complètement à droite. Il n'est pas radicalement différent, mais il est conçu pour éviter ce défaut. Pour une bonne comparaison visuelle, regarde sites.google.com/site/murmurhash/avalanche
OriginalL'auteur Dummy00001
J'ai essayé beaucoup de rapide des fonctions de hachage et choisi celui-ci:
Il est aussi rapide que le K&R la fonction (en fait même plus rapide), mais rend mieux (plus même) de distribution.
OriginalL'auteur Ivan Polyacov
Une méthode très simple est juste de XOR toutes les valeurs. Le plus simple pour autant que je sais.
OMG. un xor a = 0. Si une chaîne avec un même nombre de des mêmes lettres... les Anagrammes de n'importe qui?
OriginalL'auteur AGee