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

Wid*_*dor 6 .net c# hash string-comparison

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

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

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

或者

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

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

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

  • 语言是 .NET 中的 C#
  • 每个文本文件 3GB
  • 哈希函数是MD5
  • 最大“备用”RAM 为 1GB

Yah*_*hia 2

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

否则我会选择B选项......

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

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