A boost::hash_combine
função de modelo leva uma referência a um hash (chamado seed
) e um objeto v
. De acordo com os documentos , ele combina seed
com o hash v
por
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Posso ver que isso é determinístico. Eu vejo porque um XOR é usado.
Aposto que a adição ajuda a mapear valores semelhantes amplamente separados, de modo que as tabelas de hash de sondagem não quebram, mas alguém pode explicar o que é a constante mágica?
Respostas:
O número mágico deve ser de 32 bits aleatórios, em que cada um tem a mesma probabilidade de ser 0 ou 1, e sem correlação simples entre os bits. Uma maneira comum de encontrar uma string de tais bits é usar a expansão binária de um número irracional; neste caso, esse número é o recíproco da proporção áurea:
Portanto, incluir este número "aleatoriamente" altera cada bit da semente; como você disse, isso significa que os valores consecutivos estarão distantes. Incluir as versões alteradas da semente antiga garante que, mesmo que
hash_value()
tenha uma faixa de valores bastante pequena, as diferenças logo se espalharão por todos os bits.fonte
0x9e3779b97f4a7800
0x9e3779b97f4a7c15
.0x9e3779b97f4a7c16
? Quer dizer, é apenas 1 de desconto.Dê uma olhada no artigo DDJ de Bob Jenkins de 1997 . A constante mágica ("proporção áurea") é explicada da seguinte forma:
fonte