【问题标题】:Compare files byte by byte or read all bytes?逐字节比较文件还是读取所有字节?
【发布时间】:2010-12-14 00:50:27
【问题描述】:

我遇到了这段代码http://support.microsoft.com/kb/320348,这让我想知道比较两个文件以确定它们是否不同的最佳方法是什么。

主要思想是优化我的程序,该程序需要验证任何文件是否相等,以创建已更改文件和/或要删除/创建的文件的列表。

目前我正在比较文件的大小,如果它们匹配,我将进入 2 个文件的 md5 校验和,但是在查看了在这个问题开头链接的代码之后,我想知道是否真的值得使用它来创建 2 个文件的校验和(基本上是在你获得所有字节之后)?

我还应该进行哪些其他验证以减少检查每个文件的工作量?

【问题讨论】:

  • 我认为这在很大程度上取决于你所说的平等。您要测试文件中文本的相等性还是实际字节数?文件的内容是什么?空格重要吗(文本相等)? MD5 校验和会在行尾找到 2 个空格和 1 个空格之间的差异,而简单的文本比较可能不会。
  • MD5 需要完整读取两个文件,然后进行哈希处理,这对于大文件来说可能很耗时。
  • 这就是为什么我想知道这个问题,而 Aliostad 和 Anon 提出了我想知道的观点。

标签: c# compare benchmarking checksum


【解决方案1】:

将两个文件读入为读取优化的小缓冲区(4K或8K),然后比较内存中优化的缓冲区(逐字节)比较。

这将为您提供所有情况下的最佳性能(差异在开头、中间或结尾)。

当然第一步是检查文件长度是否不同,如果是这样,文件确实不同..

【讨论】:

  • +1 谢谢,最初我在进入校验和之前已经在检查文件的大小。但是现在我肯定会将它从校验和更改为具有小缓冲区的流,无论如何我都会检测到文件是否相等,对吗?我二进制、文本或 w/e 文件是...
【解决方案2】:

如果您还没有计算文件的哈希值,那么您不妨进行适当的比较(而不是查看哈希值),因为如果文件相同,则工作量相同,但如果它们'不一样,你可以早点停下来。

当然,一次比较一个字节可能有点浪费 - 一次读取整个块并比较它们可能是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2018-12-15
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多