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 生成的散列不反映在文本上的主要内容,如果未能解决你的问题,请参考以下文章