在第二个散列函数中使用复合数字进行双重散列

时间:2018-05-25 15:07:07

标签: data-structures hash hash-collision

我意识到最好的做法是在第二个哈希函数的mod函数中使用最大的素数(小于数组的大小)是最佳实践。

但我的问题是关于使用不是素数的数字。 我对这个概念背后的想法只对伪代码不感兴趣。

假设我有一个数组m = 20,我必须在6,9,12和15之间选择作为将在第二个散列函数中输入的值。他们中的哪一个会给我最好的传播'?

我的第一个想法是选择与素数相同的想法,只是略微修改,这意味着使用最大数量的最小数量的排列:

6 - > 2,3

9 - > 3,3 = 3

12 - > 2,3,4,6-

15 - > 3,5-

蝙蝠的权利我可以规则6(存在相同数量的排列的更大数字)和12(更多的排列)。

现在问题出现了,如果我使用9 - 具有最少的排列量,或者我应该选择15 - 尽管它有更多的排列它比9更大并且更接近数组的大小(m = 20) )。

我使用这种方法是否正确?或者是否有更好的选择数字的方法,因为我只能从上述数字中选择?

1 个答案:

答案 0 :(得分:1)

我找到了我正在寻找的答案,所以我在这里留下正确的答案,以防万一其他人需要它。

如果我们被迫选择一个不是素数的数字作为第二个哈希函数中使用的数字(在该函数的mod中):

正确的方法是使用GCD函数(最大公分母)来查找“相对于彼此的素数”。这意味着我们正在寻找其带有20的gcd将导致1的任何数字。

在这种情况下:

gcd(20,6)= 2
gcd(20,9)= 1
gcd(20,12)= 3
gcd(20,15)= 5

正如我们所看到的,20和9之间的gcd是1,这意味着他们没有除1以外的共同因素。因此,9是正确的答案。