在rabin-karp滚动哈希中选择基数和模数素数

时间:2014-01-29 16:05:49

标签: algorithm language-agnostic

哈希函数在Wikipedia

上解释

它说,“a和n的选择对于获得良好的散列是至关重要的;”并且指的是一种感觉不相关的线性同余生成器文章。我无法弄清楚如何选择价值观。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

该算法的基础是最多 d 的非零多项式最多 d 零。每个length- k 字符串都有自己的相关多项式 k - 1,我们通过减去相关字符串的多项式并在一。如果字符串相等,则结果始终为零。如果字符串不相等,那么结果为零,当且仅当 a 是多项式差的零点之一时(这是将素数要求放在 n ,因为整数mod n 否则不会是一个字段。)

理论上,至少,我们希望 a 是随机的,这样一个不经意的对手就不会以任何频率创造误报。如果我们没有预料到麻烦,那么最好选择 a 以便乘以 a 便宜(例如, a的二进制扩展具有少量的一位)。然而,一些选择在典型的字符串集上是不好的(例如, a = 1)。我们希望 n 足够大以避免误报(概率( k - 1)/ n )随机偶然但小到最好一种特殊形式,以便模数计算是有效的。