web-dev-qa-db-fra.com

Raison du nombre 5381 dans la fonction de hachage DJB?

Quelqu'un peut-il me dire pourquoi le nombre 5381 est utilisé dans la fonction de hachage DJB?

La fonction DJB Hash est

h (0) = 5381

h (i) = 33 * h(i-1) ^ str [i]

Un programme c:

unsigned int DJBHash(char* str, unsigned int len)
{
   unsigned int hash = 5381;
   unsigned int i    = 0;

   for(i = 0; i < len; str++, i++)
   {   
      hash = ((hash << 5) + hash) + (*str);
   }   

   return hash;
}
41
viji

5381 est juste un nombre qui, lors des tests, a entraîné moins de collisions et meilleure avalanche . Vous trouverez des "constantes magiques" dans presque tous les algo de hachage.

28
Mahmoud Al-Qudsi

Je suis tombé sur un commentaire qui éclaire ce que DJB est en train de faire:

/*
* DJBX33A (Daniel J. Bernstein, Times 33 with Addition)
*
* This is Daniel J. Bernstein's popular `times 33' hash function as
* posted by him years ago on comp.lang.c. It basically uses a function
* like ``hash(i) = hash(i-1) * 33 + str[i]''. This is one of the best
* known hash functions for strings. Because it is both computed very
* fast and distributes very well.
*
* The magic of number 33, i.e. why it works better than many other
* constants, prime or not, has never been adequately explained by
* anyone. So I try an explanation: if one experimentally tests all
* multipliers between 1 and 256 (as RSE did now) one detects that even
* numbers are not useable at all. The remaining 128 odd numbers
* (except for the number 1) work more or less all equally well. They
* all distribute in an acceptable way and this way fill a hash table
* with an average percent of approx. 86%.
*
* If one compares the Chi^2 values of the variants, the number 33 not
* even has the best value. But the number 33 and a few other equally
* good numbers like 17, 31, 63, 127 and 129 have nevertheless a great
* advantage to the remaining numbers in the large set of possible
* multipliers: their multiply operation can be replaced by a faster
* operation based on just one shift plus either a single addition
* or subtraction operation. And because a hash function has to both
* distribute good _and_ has to be very fast to compute, those few
* numbers should be preferred and seems to be the reason why Daniel J.
* Bernstein also preferred it.
*
*
* -- Ralf S. Engelschall <[email protected]>
*/

C'est une fonction de hachage légèrement différente de celle que vous regardez, bien qu'elle utilise le nombre magique 5831. Le code sous ce commentaire sur la cible du lien a été déroulé.

Ensuite, j'ai trouvé ce :

Magic Constant 5381:

  1. odd number

  2. prime number

  3. deficient number

  4. 001/010/100/000/101 b

Il y a aussi ceci réponse à Quelqu'un peut-il expliquer la logique derrière la fonction de hachage djb2? Il fait référence à un post par DJB lui-même à une liste de diffusion qui mentionne 5381 (extrait de cette réponse extrait ici):

[...] pratiquement tout bon multiplicateur fonctionne. Je pense que vous vous inquiétez du fait que 31c + d ne couvre aucune plage raisonnable de valeurs de hachage si c et d sont compris entre 0 et 255. C'est pourquoi, quand j'ai découvert la fonction de hachage 33 et commencé à l'utiliser dans mes compresseurs , J'ai commencé avec une valeur de hachage de 5381. Je pense que vous constaterez que cela fait aussi bien qu'un multiplicateur 261.

58
Mark Johnson

J'ai trouvé une propriété très intéressante de ce nombre qui peut être une raison à cela.

5381 est 709e premier.
709 est 127e premier.
127 est le 31e premier.
31 est 11e premier.
11 est le 5e premier.
5 est le 3e nombre premier.
3 est 2e prime.
2 est le premier nombre premier.

5381 est le premier nombre pour lequel cela se produit 8 fois. 5381e premier peut dépasser la limite de l'int. Signé, c'est donc un bon point pour arrêter la chaîne.

22
Deep Joshi