Attualmente Boost ha una funzione hash_combine che emette un numero intero senza segno a 32 bit (per essere precisi, size_t). Alcuni riferimenti:Come creare un buon hash_combine con output a 64 bit (ispirato a 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
vorrei esplorare su come creare la versione a 64 bit di hash_combine.
La prima cosa è ottenere il rapporto aureo o qualsiasi altro numero irrazionale in 64 bit.
La seconda parte consiste nell'utilizzare i turni. Questa parte è piuttosto complicata e mi piacerebbe chiedere se ci sono buone pratiche o guida sull'uso dei turni per ottenere i valori hash? O scegliendo turni come il codice originale:
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
è totalmente casuale?
Inoltre, come valutare l'output di hash_combine
per assicurarsi che non crei più collisioni rispetto alla funzione di hash originale hash_value
?
2^64/φ è '0x9E3779B97F4A7C15'. –
Grazie Kerrrek. Trovare il valore non è un problema. Quello che mi interessa è che ci sono delle regole o delle migliori pratiche per usare i turni e le aggiunte come si vede in boost :: hash_combine. O scegliere turni e aggiunte sono totalmente casuali. – Viet
Penso che dovresti [presentare un bug report] (http://svn.boost.org/trac/boost/newticket). – kennytm