关于杜鹃哈希的几个问题

时间:2011-09-12 04:50:24

标签: dictionary hashtable hash

我需要构建一个包含8字节整数键的快速查找表。表构造在初始化期间完成,之后数据不会更新。数据项的数量低于100K,因此我可以使用额外的空间来使哈希表稀疏。但是,数据查找必须尽可能高效。 据我所知,Cuckoo Hashing似乎非常适合这种情况。但是,我对一些事情并不十分清楚:

  1. 在这种情况下应该使用哪些哈希函数族?一些论文认为标准的“((a * x + b)mod p)mod m”函数族不是一个好的选择。此外,p必须是素数> UInt64.MaxValue,这使得计算函数变得困难。乘法“(a * x)>>(w - log(m))”族也不被认为是一个好的选择。我找不到关于使用什么功能的明确答案。

  2. “插入”操作可以触发重新散列。所以从理论上讲,插入时间在最坏的情况下是无限的(你只是选择一个“坏”函数导致重新加速)。我明白,这个概率几乎为零,但我很难在生产中忽略这个问题。

  3. 针对所描述的问题,是否有更好的数据结构? original Cuckoo Hash paper表明,当您有足够的额外空间(项目数量的两到三倍)时,简单的线性探测哈希可以更有效。此外,在构建阶段,我可以检查是否有两个以上的键发生冲突并选择不同的散列函数(我可以负担几次并选择最好的一个)。

  4. 非常感谢您的回复。

1 个答案:

答案 0 :(得分:0)

  1. 几乎所有哈希函数都可以,因为你只有100K键才能确保它至少是2个独立的(见http://www.eecs.harvard.edu/~michaelm/postscripts/soda2008b.pdf)或者只是快速使用。

  2. 如果您进行详尽的搜索,插入程序将在摊销/预期的O(1)时间内工作,因为您在开始时这样做会很好。如果利用率低于50%(即,插槽数> 2倍密钥数),则插入触发重新散列的概率很小。您可以使用存储(http://www.eecs.harvard.edu/~michaelm/postscripts/esa2008full.pdf)使其更小,查找仍然很小。在任何情况下只需重试,直到一切正常,因为你只是在初始化时这样做。

  3. 剪切两次,测量一次。