La función de plantilla boost::hash_combine
toma como referencia un hash (llamado seed
) y un objeto v
. De acuerdo con la docs, combina seed
con el hash de v
porNúmero mágico en boost :: hash_combine
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 de prueba no se rompan, pero ¿alguien puede explicar qué es la constante mágica?
Teniendo en cuenta que en muchos equipos con un costo entero de girar alrededor de la misma como un cambio podría haber algún beneficio en convertir la expresión a:
seed ^= hash_value(v) + 0x9e3779b9 + rotl(seed, 6) + rotr(seed, 2);
–