什么是cuckoo哈希中的“新哈希函数”?

5
我正在阅读Pagh和Rodle的《杜鹃哈希》(cuckoo hashing)一文,但无法理解以下段落的含义: “这个过程可能会出现循环,如图1(b)所示。因此,迭代次数受到一个“MaxLoop”值的限制,该值将在2.3节中指定。如果达到了这个迭代次数,我们将使用新的哈希函数对表中的键进行重新哈希,并尝试再次容纳该无巢键。无需为重新哈希分配新表:我们只需简单地遍历表,删除并对所有未在其目标位置上的键执行常规插入操作即可。”
“使用新的哈希函数”是什么意思? 在插入算法中,表格被调整大小。我们是否应该有一个用于哈希函数的“池子”来使用?我们如何创建这个池?
回答:当最大循环次数(MaxLoop)被耗尽时,杜鹃哈希会使用新的哈希函数对表中的键进行重新哈希,以尝试再次容纳无巢键。不需要重新分配新的表,只需要通过遍历表,删除未在目标位置上的键,并对它们进行常规的插入操作即可。至于如何创建哈希函数的“池子”,该文章没有给出相关信息。
1个回答

3
是的,他们正在期待新的哈希函数,就像他们所说的那样。幸运的是,他们并不需要一堆新算法,只需要在您当前的数据集上稍微改变哈希行为即可。
请看论文2.1节和附录A。它讨论了随机通用哈希函数的构建。
一个简单而有启发性的例子是,假设您有一些正常的哈希函数,它对字节块进行操作。我们将其称为H(x)。您想使用它来产生一族新的、略微不同的哈希函数H_n(x)。好吧,如果H(x)很好,并且您的要求不高,您可以定义H_n(x) = H(concat(n,x))。您没有关于H_n(x)行为的强大保证,但您会期望它们中的大多数是不同的。

如果我理解正确,我们要么从您提到的这个集合中获取一个新的哈希函数并保持表大小不变,要么使用相同的2个哈希函数调整表的大小并永远不改变它们? - Jim
两个选项都几乎肯定会打破当前循环。如果您不关心占用的空间量,调整大小可能更有用,因为它将降低另一个循环的可能性(直到您存储更多键为止)。请记住,调整大小也是一种哈希函数的更改,因为您可能正在使用哈希函数模除表的大小;增加大小将改变事物的位置。 - Jay Kominek
因此,如果我们使用新的哈希表(a)并保持表大小不变,那么如何确定表的大小呢?从论文中我并不清楚。如果要插入的键的数量是未知的,那么如何为布谷鸟算法推导出一些表大小呢? - Jim
我的意思是,如果我们使用一个新的哈希函数并重新哈希,这意味着表的大小保持不变。那么表的大小是如何确定的,它什么时候会增长? - Jim
最简单的方法就是为每个哈希表指定一个负载因子。让用户选择它,或使用一些默认值。当表中的项目数达到表大小*负载因子时,您需要扩展它。较小的负载因子应该意味着更高的性能(更少的冲突),但也会浪费更多的空间。 - Jay Kominek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接