散列函数为64位到10位

Met*_*est 5 c linux hash gcc x86-64

我想要一个需要长数(64位)并产生10位结果的哈希函数.为此目的,最好的哈希函数是什么.输入基本上是变量的地址(地址在Linux上是64位或8字节),所以我的哈希函数应该为此目的进行优化.

rod*_*igo 6

我会说像这样的事情:

uint32_t hash(uint64_t x)
{
    x >>= 3;
    return (x ^ (x>>10) ^ (x>>20)) & 0x3FF;
}
Run Code Online (Sandbox Code Playgroud)

最重要的3位不是很有用,因为大多数变量是4字节或8字节对齐,所以我们删除它们.然后我们采用接下来的30位并将它们混合在一起(XOR),每块10位.

当然,你也可以参加,(x>>30)^(x>>40)^(x>>50)但我不确定他们是否会在练习中有所作为.

  • 由于你使用xor-shift进行混合,我建议使用其中一个已知的275个三元组,其中64x64矩阵具有2 ^ 64-1周期,如Marsaglia所述,例如(7,11,10)或(21,17) ,48).由于这会以伪随机方式混合比特而没有已知的奇数,因此在执行&0x3ff之前将所有字合并在一起是有效的.这样,每个输入位都应该有机会影响所有输出位.也许不像加密哈希那样完美地分布50:50,但是你可以得到最好的.除此之外,仍然是一个很好的主意,+ 1 (3认同)