Actualmente Boost tiene la función hash_combine que genera un entero sin signo de 32 bits (para ser precisos, size_t). Algunas referencias:Cómo crear un buen hash_combine con salida de 64 bits (inspirado por boost :: hash_combine)
http://www.boost.org/doc/libs/1_43_0/doc/html/hash/reference.html#boost.hash_combine
http://www.boost.org/doc/libs/1_43_0/doc/html/hash/combine.html
Magic number in boost::hash_combine
me gustaría explorar sobre cómo crear la versión de 64 bits de hash_combine.
Lo primero es obtener la proporción áurea o cualquier otro número irracional en 64 bits.
La segunda parte es usar turnos. Esta parte es bastante complicada y me gustaría preguntar si hay mejores prácticas o una guía sobre el uso de turnos para obtener valores hash. O la elección de turnos como el código original:
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
es totalmente aleatorio?
También, ¿cómo evaluar la salida de hash_combine
para asegurarse de que no cree más colisiones que la función hash original hash_value
?
2^64/φ es '0x9E3779B97F4A7C15'. –
Gracias Kerrrek. Encontrar el valor no es un problema. Lo que me interesa es si existen reglas o mejores prácticas para usar los cambios y las adiciones como se ve en el impulso :: hash_combine. O elegir turnos y adiciones son totalmente al azar. – Viet
Creo que debería [presentar un informe de error] (http://svn.boost.org/trac/boost/newticket). – kennytm