选择字符串散列的参数

时间:2016-06-16 19:39:57

标签: string hash hashmap hashtable primes

我最近在阅读一篇关于字符串哈希的文章。我们可以通过将字符串转换为多项式来散列字符串。

  

H(s1s2s3 ... sn)=(s1 + s2 * p + s3 *(p ^ 2)+ ... + sn *(p ^ n-1))mod M。

对p和M的约束是什么,以便碰撞概率降低?

  1.   

    对字符串的哈希函数的一个很好的要求是它应该很难找到   优选具有相同长度n的一对不同的弦,具有相同的指纹。这个   不包括M

  2.   

    类似地,如果gcd(M,p)> 1然后p模M的幂可以重复   小于n的指数。最安全的选择是将p设置为其中之一   组U(ZM)的生成器 - 所有整数的组   在乘法模M下,M相对于素数。

  3. 我无法理解上述限制。如何选择M< n和gcd(M,p)> 1增加碰撞?有人可以用一些例子解释这两个吗?我只需要对这些有基本的了解。

    此外,如果任何人都可以专注于M的上限和下限,那就足够了。 上述事实摘自以下文章string hashing mit

2 个答案:

答案 0 :(得分:1)

"正确"这些问题的答案涉及一定数量的数论,但是看一些极端情况以了解约束可能有用的原因通常是有益的。

例如,让我们看看为什么我们想要M≥n。作为极端情况,让我们选择M = 2和n = 4.然后看数字p 0 mod 2,p 1 mod 2,p < sup> 2 mod 2,并且p 3 mod 2.因为这里有四个数字,只有两个可能的余数,根据鸽子原理,我们知道这些数字中至少有两个必须是等于。为简单起见,假设p 0 和p 1 是相同的。这意味着散列函数将为前两个字符已被交换的任何两个字符串返回相同的散列码,因为这些字符乘以相同的量,这不是散列函数的理想属性。更一般地说,我们希望M≥n的原因是p 0 ,p 1 ,...,p n-1 至少有可能与众不同。如果M < n,只有太多的p权力才能让它们独一无二。

现在,让我们考虑为什么我们想要gcd(M,p)= 1.作为极端情况,假设我们选择p使得gcd(M,p)= M(也就是说,我们选择p = M)。然后

  

s 0 p 0 + s 1 p 1 + s 2 p 2 + ... + s n-1 p n-1 (mod M)

     

= s 0 M 0 + s 1 M 1 + s 2 M 2 + ... + s n-1 M n-1 (mod M)

     

= s 0

哎呀,这不好 - 这使我们的哈希码完全等于字符串的第一个字符。这意味着如果p不与M相互作用(即,如果gcd(M,p)≠1),则存在某些字符被“修改”的风险&#34;哈希码,增加冲突概率。

答案 1 :(得分:1)

  

如何选择M&lt; n和gcd(M,p)> 1会增加碰撞吗?

在哈希函数公式中,可以合理地使用 M 将哈希结果限制为特定的位宽:例如对于16位散列,M = 2 16 ,对于32位散列,M = 2 32 ,对于64位散列,M = 2 ^ 64。通常,实现中实际上不需要mod /%操作,因为使用散列计算的所需大小的无符号整数本身就可以执行该函数。

我不推荐它,但有时你会看到人们描述散列函数,这些散列函数完全与特定散列表的大小相关联,他们将结果直接修改为表格大小。

您引用的文字说:

  

字符串上的散列函数的一个很好的要求是,应该很难找到具有相同指纹的一对不同的字符串,最好是相同长度的n。这排除了M

这在三个单独的问候上似乎有点傻。首先,它暗示散列长文本需要大量长的哈希值,实际上它是你选择M时最需要考虑的文本的不同段落的数量。

更具体地说,如果你有一个很好的通用散列函数散列的V个不同的值,如果你的散列函数产生至少V 2 不同的哈希值。例如,如果要散列1000个值(~2 10 ),则希望M至少为1百万(即至少2 * 10 = 20位散列值,这对于圆形是好的高达32位但理想情况下不适合16位)。阅读Birthday Problem了解相关见解。

其次,假设n是字符数,则潜在值的数量(即不同的输入)是任何特定字符可以采用的不同值的数量,增加到幂n。前者可能介于26到256个值之间,具体取决于散列是仅支持字母,还是支持字母数字输入,或标准扩展ASCII和控制字符等,甚至更多用于Unicode。 &#34;的方式排除了M&lt;的选择。 n&#34; 意味着M和n之间的任何相关线性关系都是假的;如果有的话,当M低于不同潜在输入值的数量时,它会越来越多地促进冲突,但同样又是实际的不同输入的数量往往很重要等等。

第三,&#34;最好长度相同n&#34; - 为什么这么重要?据我所知,它不是。

我没有添加到templatetypedef关于gcd的讨论。