【发布时间】:2012-08-05 23:02:37
【问题描述】:
这是 Knuth 乘法哈希的正确实现吗?
int hash(int v)
{
v *= 2654435761;
return v >> 32;
}
乘法中的溢出会影响算法吗?
如何提高这种方法的性能?
【问题讨论】:
-
你几乎肯定想使用
unsigned int(或unsigned long long,因为它似乎取决于>32位的大小)而不是普通的int。 -
是的,溢出肯定会阻止这个工作。事实上,如果您的
int是典型的,则此代码将始终返回 0 或 -1。 -
你的位移是(如果 int 是 32 位)到远。你的哈希应该有多少位?从 32 中减去它们
-
@Fox32 好的,所以如果我想要 32 位哈希,我不需要移位
-
假设典型情况下,溢出实际上是可以的(虽然不是可移植的)。移位很奇怪(尝试丢弃所有位),但意外且不可移植通常可以正常工作(对于 x86 上的 32 位参数,移位量取模 32)。