La boost::hash_combine
función de plantilla toma una referencia a un hash (llamado seed
) y un objeto v
. Según los documentos , se combina seed
con el hash de v
by
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Puedo ver que esto es determinista. Veo por qué se usa un XOR.
Apuesto a que la adición ayuda a mapear valores similares ampliamente separados para que las tablas hash de prueba no se rompan, pero ¿alguien puede explicar cuál es la constante mágica?
Respuestas:
Se supone que el número mágico es de 32 bits aleatorios, donde es igualmente probable que cada uno sea 0 o 1, y sin una correlación simple entre los bits. Una forma común de encontrar una cadena de tales bits es usar la expansión binaria de un número irracional; en este caso, ese número es el recíproco de la proporción áurea:
Entonces, incluir este número "aleatoriamente" cambia cada bit de la semilla; como dices, esto significa que los valores consecutivos estarán muy separados. La inclusión de las versiones modificadas de la semilla anterior asegura que, incluso si
hash_value()
tiene un rango de valores bastante pequeño, las diferencias pronto se extenderán entre todos los bits.fuente
0x9e3779b97f4a7800
0x9e3779b97f4a7c15
.0x9e3779b97f4a7c16
? Quiero decir, es solo 1 de descuento.Eche un vistazo al artículo de DDJ de Bob Jenkins de 1997 . La constante mágica ("proporción áurea") se explica de la siguiente manera:
fuente