【问题标题】:Comparing large text files - Is comparing hashes faster than using subsets of the file?比较大型文本文件 - 比较哈希是否比使用文件的子集更快?
【发布时间】:2011-12-02 06:46:06
【问题描述】:

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

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

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

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

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

我期待几个“取决于”的答案,所以如果你想使用一些假设:

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

【问题讨论】:

    标签: c# .net hash string-comparison


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:
      1. MD5 校验和会比较慢,因为您需要处理这两个文件才能得到结果。你说你有 3GB 的文件,而你只有 1GB 的内存空闲。

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

      我会选择选项 2。

      【讨论】:

      • + 1 先检查文件大小
      【解决方案3】:

      假设您以后不再使用散列信息(与其他文本进行比较,或检查未来可能发生的变化),那么有两种情况: A) 文件相同 B) 文件不同

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        相关资源
        最近更新 更多