我想要一个散列函数,它接受一个长数字(64 位)并产生 10 位的结果。用于此目的的最佳哈希函数是什么。输入基本上是变量的地址(地址在 Linux 上是 64 位或 8 字节),因此我的哈希函数应该为此目的进行优化。
最佳答案
我会这样说:
uint32_t hash(uint64_t x)
{
x >>= 3;
return (x ^ (x>>10) ^ (x>>20)) & 0x3FF;
}
最低有效的 3 位不是很有用,因为大多数变量是 4 字节或 8 字节对齐的,所以我们将它们删除。 然后我们取出接下来的 30 位并将它们混合在一起 (XOR),每 block 10 位。
当然,您也可以使用 (x>>30)^(x>>40)^(x>>50)
但我不确定它们是否会有所不同在实践中。
关于c - 64 位到 10 位的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11359441/