为什么随机字节比较不是测试相等的好方法?

时间:2015-02-11 20:16:46

标签: performance random hash

我想要比较两个50G +文件的相等性。

' diff -a'或者' cmp'会工作,但很慢。

散列两个文件并比较散列会更快(?),但是 仍然相当慢。

相反,假设我在1到50G之间随机选择10,000个数字, 并使用seek()获取速度,比较两个文件中的特定字节。

我声称有机会将10,000个随机选择的字节匹配 巧合的两个文件大约是256 ^ 10000到1(或大约1英寸) 10 ^ 2408)。

这比任何已知的哈希函数都要好几个数量级, 并且更快。

那么,这个论点有什么不对?为什么不进行随机字节测试 优于哈希?

这个问题的灵感来自:

What is the fastest way to check if files are identical?

(我建议采用类似但略有不同的方法)

2 个答案:

答案 0 :(得分:1)

如果你在某处有意外的位翻转怎么办?即使只有一个就足以使你的检查失败

答案 1 :(得分:0)

只有当两个文件本身包含随机字节时,您的赔率计算才会成立,这几乎肯定不是这种情况。在同一系统上两个相同大小的大文件很可能是高度相关的。例如,在我的系统上现在有三个相同大小的文件在8GB范围内 - 它们是SD卡的原始转储,代表相同软件的不同版本,因此很可能只有几百个字节不同。这同样适用于连续几天的两个数据库快照。

因为只有几个字节差异的大文件是一种非常可能 - 实际上很可能 - 的情况,你真的别无选择,只能读取两者的每个字节。散列将至少使您无法比较每个字节。

您可以做的一件事是以预先确定的伪ramdom顺序访问每个文件中的块,以最大限度地发现差异的小块并且能够在失败时提前中止。