La boost::hash_combine
fonction de modèle prend une référence à un hachage (appelé seed
) et à un objet v
. Selon la documentation , il se combine seed
avec le hachage de v
by
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Je peux voir que c'est déterministe. Je vois pourquoi un XOR est utilisé.
Je parie que l'ajout aide à mapper des valeurs similaires largement les unes des autres afin que les tables de hachage ne se décomposent pas, mais quelqu'un peut-il expliquer quelle est la constante magique?
Réponses:
Le nombre magique est censé être 32 bits aléatoires, chacun étant également susceptible d'être 0 ou 1, et sans corrélation simple entre les bits. Une manière courante de trouver une chaîne de ces bits est d'utiliser le développement binaire d'un nombre irrationnel; dans ce cas, ce nombre est l'inverse du nombre d'or:
Donc, inclure ce nombre "au hasard" change chaque bit de la graine; comme vous le dites, cela signifie que les valeurs consécutives seront très éloignées. L'inclusion des versions décalées de l'ancienne graine garantit que, même si elle
hash_value()
a une plage de valeurs assez petite, les différences seront bientôt réparties sur tous les bits.la source
0x9e3779b97f4a7800
0x9e3779b97f4a7c15
.0x9e3779b97f4a7c16
? Je veux dire, c'est seulement 1 off.Jetez un œil à l' article DDJ de Bob Jenkins de 1997 . La constante magique ("nombre d'or") est expliquée comme suit:
la source