Rabin Karp Rolling Hash 生成的散列不反映在文本上

Posted

技术标签:

【中文标题】Rabin Karp Rolling Hash 生成的散列不反映在文本上【英文标题】:Hashes generated by Rabin Karp Rolling Hash not reflecting on the Text 【发布时间】:2012-01-15 07:09:22 【问题描述】:

注意:很多可能的重复,但似乎没有解决我的问题。

我正在基于MOSS 进行抄袭检测。

在成功实现过滤器去除所有必要的细节(cmets、标点符号等)后,我使用滚动哈希实现(Rabin Karp)对内容进行哈希处理

然而,在两个源代码文本文件中匹配的哈希,具有非常不同的底层文本(没有抄袭,但哈希相同)

我实现的算法(Ruby) --> (部分片段)

 #Preprocessing from RobinKarp Algorithm
  for c in 0...k do
    text_hash=(radix*text_hash+text_to_process[c].ord)%q
  end

  #Main loop
  for c in 0...loop do   
        text_hash=((radix*text_hash-(text_to_process[c].ord)*highorder)+(text_hash[c+k].ord))%q    

我的实现有问题吗?还是我指定的参数有问题?

我取 radix=34 (我不确定它是否是正确的值,我假设删除的文本将只包含字母+一些特殊字符,如 '+'、'-'、'*'、'/' 所以粗略估计总共 34字符)

我将 q(prime) 设为 101

这是我正在处理的碰撞问题吗?关于如何解决问题的任何指示?

【问题讨论】:

【参考方案1】:

我注意到,当 q = 101 时,只有 101 个可能的哈希值 - 0、1、2...100。你试过增加q吗?另一种方法是查看哈希值是否看起来像是在 0,1..q-1 的可能值中随机选择的值。

当然,您还应该在存在重复字符串以供查找的情况下测试您的程序 - 失败可能是导致冲突的任何问题的另一种症状,并且更容易找到和调试。

【讨论】:

将 q 增加到 1001 肯定会进一步限制匹配,但仍然存在与底层文本不同的虚假匹配。 您认为基数的最佳值应该是多少? 我会让基数比您期望的最大字符值大一。然后文本散列将由它散列的字符序列唯一确定,除了它是计算 mod q 的事实。请注意,即使对于非常大的 q 值,您也可能会发生一些冲突 - 这是 en.wikipedia.org/wiki/Birthday_problem 的示例。

以上是关于Rabin Karp Rolling Hash 生成的散列不反映在文本上的主要内容,如果未能解决你的问题,请参考以下文章

Rabin-Karp ACM训练

PHP 中的 Rabin-Karp 算法

Rabin-Karp算法代码中的负哈希值

Rabin-Karp 字符串搜索算法

C# 中的 Rabin-Karp 算法 [关闭]

Rabin-Karp 字符串匹配不匹配