在第二个哈希函数中使用合数进行双重哈希

Double hashing using composite numbers in second hash function

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

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

假设我有一个数组 m=20,我必须在 6、9、12 和 15 之间进行选择,作为将输入到第二个哈希函数中的值。其中哪一个会给我最好的 'spread'?

我的第一个想法是采用与选择质数相同的想法,只是稍微 mod 化,这意味着使用具有最少排列量的最大数:

6 -> 2,3

9 -> 3,3 = 3

12 -> 2,3,4,6

15 -> 3,5

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

现在问题来了,我应该使用 9 - 具有最少的排列,还是应该选择 15 - 虽然它有更多的排列,但它比 9 大得多并且更接近数组的大小 (m =20).

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

我找到了我要找的答案,所以我把问题和正确答案留在这里,以防其他人需要它。

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

正确的方法是使用 GCD 函数(最大公分母)来查找 "prime with respect to each other" 的数字。这意味着我们正在寻找其 gcd 为 20 的结果为 1 的任何数字。

在这种情况下:

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

我们可以看到,20和9之间的gcd为1,这意味着他们除了1之外没有公因数。因此,9是正确答案。