我正在实现我自己的具有通用值类型的专用哈希图,但键总是长类型。在这里和那里,我看到人们建议我应该将键乘以素数,然后按桶数取模:
int bucket = (key * prime) % numOfBuckets;
我不明白为什么?在我看来,它的分布与 simple 完全相同:
int bucket = key % numOfBuckets;
例如,如果 numOfBuckets 为 8,则使用第二个“算法”我们会得到像 {0, 1, 2, 3, 4, 5, 6, 7} 这样的桶重复 key = 0 到无穷大。在相同键的第一个算法中,我们得到桶 {0, 3, 6, 1, 4, 7, 2, 5}(或类似的)也重复。基本上我们有同样的问题,就像使用身份哈希时一样。
基本上,在这两种情况下,我们都会遇到键冲突:
key = x + k*numOfBuckets (for k = 1 to infinity; and x = key % numOfBuckets)
因为当我们对 numOfBuckets 取模时,我们总是得到 x。那么,第一个算法是怎么回事,有人可以启发我吗?