djb2 Fonction de Hachage
Je suis en utilisant le djb2 algorithme pour générer la clé de hachage pour une chaîne qui est comme suit
hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
Maintenant à chaque boucle il y a une multiplication à deux chiffres, Après un certain temps avec le 4ème de la 5ème caractère de la chaîne il y a un dépassement de la valeur de hachage devient énorme
Quelle est la bonne façon de revoir, de sorte que la valeur de hachage ne déborde pas et le hachage arrive aussi correctement
- Il n'y a pas une telle chose comme DJB2 de hachage, il est le seul de la norme DJB, puis Salsa20 et coll.
- cst.yorku.ca/~oz/hash.html fait référence à DJB2, je crois que la terminologie est largement utilisé, si ce ne sont pas officiellement reconnus.
Vous devez vous connecter pour publier un commentaire.
Les calculs de hachage souvent de débordement. Ce n'est généralement pas un problème, tant que vous avez des garanties sur ce qui va arriver quand il ne de débordement. N'oubliez pas que le point de hachage n'est pas d'avoir un certain nombre qui signifie quelque chose en termes de magniture etc - c'est juste un moyen de détection de l'égalité. Pourquoi serait-débordement interférer avec qui?
Vous ne devriez pas le faire. Depuis il n'y a pas de modulo, débordement d'entier est le comportement attendu de la fonction (et il a été conçu avec à l'esprit). Pourquoi voulez-vous changer?
Je suis en train de penser à l'aide de votre statique/exécution de l'analyseur afin de les avertir des débordements d'entiers? C'est bien l'un de ces cas où vous pouvez ignorer l'avertissement. Les fonctions de hachage sont conçus pour des types de propriétés, donc ne vous inquiétez pas les mises en garde de votre analyseur. Il suffit de ne pas essayer de créer une fonction de hachage-vous!
retour (hash & 0xFFFFFFFF); //ou quel que soit le masque que vous souhaitez, n'a pas d'importance aussi longtemps que vous le garder cohérente.