我想要比较两个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?
(我建议采用类似但略有不同的方法)
答案 0 :(得分:1)
如果你在某处有意外的位翻转怎么办?即使只有一个就足以使你的检查失败
答案 1 :(得分:0)
只有当两个文件本身包含随机字节时,您的赔率计算才会成立,这几乎肯定不是这种情况。在同一系统上两个相同大小的大文件很可能是高度相关的。例如,在我的系统上现在有三个相同大小的文件在8GB范围内 - 它们是SD卡的原始转储,代表相同软件的不同版本,因此很可能只有几百个字节不同。这同样适用于连续几天的两个数据库快照。
因为只有几个字节差异的大文件是一种非常可能 - 实际上很可能 - 的情况,你真的别无选择,只能读取两者的每个字节。散列将至少使您无法比较每个字节。
您可以做的一件事是以预先确定的伪ramdom顺序访问每个文件中的块,以最大限度地发现差异的小块并且能够在失败时提前中止。