Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较大型文本文件-比较哈希是否比使用文件子集更快?_C#_.net_Hash_String Comparison - Fatal编程技术网

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

C# 比较大型文本文件-比较哈希是否比使用文件子集更快?,c#,.net,hash,string-comparison,C#,.net,Hash,String Comparison,假设我有两个据称相同的大(文本)文件,但我想确认一下。整个哈利波特系列的成人版和儿童版也许 如果全文的字符串表示太大,无法立即保存在内存中,那么执行以下操作是否会更快: a) 将两个文件全部散列,然后测试散列是否相同 或 b) 读入每个文件的可管理块并进行比较,直到达到EOF或发现不匹配 换句话说,比较2个小散列的便利性是否会被生成所述散列所花费的时间所抵消 我期待着几个“视情况而定”的答案,所以如果你想要一些假设: 语言是C#in.NET 文本文件每个3GB 哈希函数是MD5 最大“

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

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

  • a) 将两个文件全部散列,然后测试散列是否相同

  • b) 读入每个文件的可管理块并进行比较,直到达到EOF或发现不匹配
换句话说,比较2个小散列的便利性是否会被生成所述散列所花费的时间所抵消

我期待着几个“视情况而定”的答案,所以如果你想要一些假设:

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

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

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

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

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

  • MD5校验和将较慢,因为您需要处理这两个文件以获得结果。你说你有3GB的文件,只有1GB的空闲内存,你可以算算

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


  • 我会选择选项2。

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

    否则我会选择B选项

    为了获得最大的速度,我将使用实例和XOR内容-比较可以在第一次遇到差异时停止(即XOR操作返回某物!=0)。关于内存消耗,您可以使用“移动窗口”(即通过调用
    CreateViewAccessor
    )来允许按字面意思处理TB大小的文件


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

    +1首先检查文件大小