比较大文本文件 - 比使用文件的子集更快地比较哈希?

时间:2011-10-06 13:54:04

标签: c# .net hash string-comparison

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

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

  • a)将两个文件全部哈希,然后测试哈希值是否相同

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

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

我期待一些“它取决于”的答案,所以如果你想要一些合作:

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

3 个答案:

答案 0 :(得分:3)

  1. MD5校验和将会变慢,因为您需要处理这两个文件才能获得结果。你说你有3GB的文件和只有1GB的内存备用数字。

  2. 在字节块中检查它们实际上会确定之前的差异,也可以通过检查文件大小,文件长度等...

  3. 我会选择2。

答案 1 :(得分:2)

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

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

如果是B,那么您可能会在文件的第一页找到差异,此时您就可以退出该过程。

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

答案 2 :(得分:2)

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

否则选项B就是我想要的......

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

甚至可以根据一些基于LINQ的比较方法来测试XOR的性能......并且总是从比较文件大小开始,这样就可以避免进行不必要的计算......