要为双哈希哈希表大小选择的最佳素数?

时间:2015-10-03 02:15:57

标签: python hash hashtable primes double-hashing

为双散列哈希表大小选择的最佳素数是多少?

旁边信息

  • 哈希表是单词分析项目的一部分,马尔可夫模型,训练机器人来模拟和生成文本,好像别人会写它(这需要很多单词,句子,成绩单,书籍... ... 语料库,越多越好)
  • 我不熟悉素数的大部分数学,但我会阅读你们提出的所有内容,然后尝试从那里开始

我的想法:

  • 素数不应该太远/彼此接近---->我不必经常增加大小,但哈希表不会半空(较少的冲突,寻找负载因子和哈希表大小之间的理想比率)
  • 最适合大型语料库 - 我不确定我必须选择的素数有多大,之前从未这样做过......
  • 我还想过实现一个函数(不是散列函数),它只是将哈希表的大小加倍,然后寻找最接近的素数------> 但是它有一个O(n)的运行时间,因为素数只能被____整除(我必须检查所有数字是否达到当前哈希表大小加倍的数字是否具有余数除了零,然后将大小增加一个/转到下一个奇数并再次测试整个循环)________ ------>你可以想象这会非常缓慢,所以更好的方法就是拥有一组固定的素数高达一百万(仅用于说明目的)左右,然后只使用这些来进行任何尺寸变化

谢谢,还有任何其他问题

2 个答案:

答案 0 :(得分:2)

选择twin prime个数字,i。即当pp - 2为素数时,选择p作为双哈希容量,因为hash_code % (size - 2)是双哈希算法的良好辅助步骤函数,模数素数更多一些“强大”而不是模数组合数(如果size - 2是复合的)。

对于小尺寸(大约1000左右)选择所有素数,除了低对子之外,因为双数对在自然数的开头是太少了规模,以获得良好的尺寸可预测性。

添加5和11的大小(虽然它们在双素数中很低),以更好地处理非常小的表格大小。

排除在乘法散列函数中经常使用的数字,在Java中它是31散列函数中使用的String,我不知道Python。

以上所有内容都在这个Java runnable中仔细编码,有很多预先生成的表格大小(试图在相邻表格大小之间保持0.005最大差异):

https://github.com/OpenHFT/Koloboke/blob/0498951705b45be2e1528afd786c03308c36e5dc/lib/impl/src/main/java/net/openhft/koloboke/collect/impl/hash/DHashCapacities.java#L255-L272

P上。 S.我个人认为,双重散列从来不是最佳的开放式寻址风格,因为模数操作在现代CPU中不成比例地昂贵。考虑使用QHash

答案 1 :(得分:1)

不确定我是否完全理解你的问题,但这里是possible solution from the java world。我理解为什么你一般需要素数,如果你必须从头开始写一个哈希函数,但不确定你是否需要研究它们,如果一个好的"使用这样的哈希函数。

希望这有帮助!