103 votes

Nombre magique dans boost::hash_combine

El boost::hash_combine La fonction modèle prend une référence à un hachage (appelé seed ) et un objet v . Selon le docs il combine seed avec le hachage de v par

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);

Je peux voir que c'est déterministe. Je vois pourquoi on utilise un XOR.

Je parie que l'addition aide à mettre en correspondance des valeurs similaires très éloignées les unes des autres, de sorte que le sondage des tables de hachage ne tombe pas en panne, mais quelqu'un peut-il expliquer ce qu'est la constante magique ?

0 votes

Étant donné que sur de nombreux ordinateurs, une rotation d'entier coûte à peu près la même chose qu'un décalage, y a-t-il un avantage à convertir l'expression en : <code> seed ^= hash_value(v) + 0x9e3779b9 + rotl(seed, 6) + rotr(seed, 2) ; </code>

156voto

Mike Seymour Points 130519

Le nombre magique est censé être constitué de 32 bits aléatoires, où chacun d'entre eux a une probabilité égale d'être 0 ou 1, et sans corrélation simple entre les bits. Une façon courante de trouver une chaîne de tels bits consiste à utiliser l'expansion binaire d'un nombre irrationnel ; dans ce cas, ce nombre est l'inverse du nombre d'or :

phi = (1 + sqrt(5)) / 2
2^32 / phi = 0x9e3779b9

L'inclusion de ce nombre modifie donc "aléatoirement" chaque bit de la graine ; comme vous le dites, cela signifie que les valeurs consécutives seront très éloignées les unes des autres. L'inclusion des versions décalées de l'ancienne graine permet de s'assurer que, même si hash_value() a une gamme de valeurs assez réduite, les différences seront rapidement réparties sur tous les bits.

0 votes

J'avais lu qu'ils avaient remarqué que cela fonctionnait plutôt bien, mais je ne savais pas que cela venait du nombre d'or :)

18 votes

Cool ! J'aime bien quand la théorie des nombres devient soudain utile :)

8 votes

@larsmans J'adore votre utilisation de "soudainement" - c'est très approprié ! La théorie des nombres, c'est du genre " ouais, c'est sympa... mais j'ai un vrai travail à faire, désolé " dans 99% des cas. Et puis, comme vous le dites, "soudain", la théorie des nombres est super super utile. Ce n'est pas comme un marteau qui est plutôt utile pour un grand nombre de choses. Au lieu de cela, c'est comme un scalpel qui est extrêmement utile pour un petit nombre de choses.

30voto

NPE Points 169956

Jetez un coup d'œil à la Article du DDJ par Bob Jenkins de 1997 . La constante magique ("golden ratio") s'explique comme suit :

Le nombre d'or est vraiment une valeur arbitraire. Son but est d'éviter de faire correspondre tous les zéros à tous les zéros.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X