比较大型文本文件 - 比较哈希值比使用文件子集更快吗?

问题描述 投票:0回答:3

假设我有两个大(文本)文件,据称它们是相同的,但我想确定一下。整个哈利波特系列的“成人”和“儿童”版本也许......

如果全文的字符串表示太大而无法一次保存在内存中,是否会更快:

  • a) 对两个文件进行完整哈希处理,然后测试哈希值是否相同

  • b)读取每个文件的可管理块并进行比较,直到达到 EOF 或发现不匹配

换句话说,比较两个小哈希值的便利性是否会被生成所述哈希值所花费的时间所抵消?

我期待一些“这取决于”的答案,所以如果你想要一些假设:

  • 语言是 .NET 中的 C#
  • 文本文件每个 3GB
  • 哈希函数是MD5
  • 最大“备用”RAM 为 1GB
c# .net hash string-comparison
3个回答
3
投票
  1. MD5 校验和会比较慢,因为您需要处理两个文件才能获得结果。你说你有 3GB 文件,但只有 1GB 空闲内存,你算一下。

  2. 以字节块形式检查它们实际上可以更早地确定任何差异,还可以通过检查文件大小、文件长度等...

我会选择选项 2。


3
投票

假设您将来不再使用哈希信息(与其他文本进行比较,或在未来可能发生更改后进行检查),那么有两种情况: A)文件相同 B) 文件不同

如果是 A,那么这两种情况几乎没有区别。两者都涉及一次读取整个文件的一个块,并对每个字节进行计算/比较。与读取文件的工作相比,哈希的计算开销是最小的。

如果是 B,那么您可能会在文件的第一页中发现差异,此时您可以退出该进程。

因此,根据 A v B 的相对概率,平均而言,比较似乎会更快。 另请注意,您可以报告更改发生的位置,而在哈希场景中则无法报告。


2
投票

选项 A 仅在您重复使用哈希值(即有其他文件进行比较)时才有用,这样计算哈希值的成本就不是一个因素......

否则我会选择B...

为了获得最大速度,我将使用

MemoryMappedFile
实例并对内容进行异或 - 比较可以在第一次遇到差异时停止(即异或操作返回某些内容!= 0)。关于内存消耗,您可以使用“移动窗口”(即通过调用
CreateViewAccessor
),这将允许逐字处理 TB 大小的文件...

甚至值得针对某些基于 LINQ 的比较方法测试 XOR 的性能...并且始终从比较文件大小开始,这样就可以避免进行不必要的计算...

© www.soinside.com 2019 - 2024. All rights reserved.