【问题标题】:MD5 hash for file in C#C#中文件的MD5哈希
【发布时间】:2014-01-19 02:57:51
【问题描述】:

如何在 C# 中计算文件的 MD5 哈希值:

Compute hash for range 1-4096 bytes -> get MD5 hash for this range;
1-8192 -> get MD5 hash for this range;
1-12288 -> get MD5 hash for this range;
1-16384 -> get MD5 hash for this range;
...
1-end of file -> get MD5 hash for file.

所以我总是使用大小为 4096 字节的缓冲区读取文件,并希望更新文件所有读取部分的哈希值。如何实现?看起来 MD5CryptoServiceProvider 无法完成这项任务。

【问题讨论】:

  • 不清楚你为什么要这样做。为什么不只是散列整个文件?为什么每个部分都需要哈希?
  • 我想按内容比较大量文件,部分读取这些文件是比较它们的好策略。最后读取部分的校验和不是我需要的,我想获取所有读取文件部分的校验和。

标签: c# md5


【解决方案1】:

通常,MD5 和其他哈希值不会这样工作。他们在最后一个块中使用了特定的填充。因此,如果您计算某些字节的最终散列,则以后不能向其添加更多字节。一旦你添加了最后一个块并计算了哈希,游戏就结束了,你必须重新开始。

我知道您想计算哈希值,但还想继续前进。

最好的策略是使用自定义 MD5 实现,让您克隆它的状态。当你添加一个块时,复制 MD5 算法的状态,所以你必须有相同状态的 MD5 哈希。您使用其中一个克隆来完成转换。你用另一个走得更远。伪代码:

hasher = new md5
loop
    read a block of the file
    hasher.addblock(current block)
    hasher2 = hasher.clone()
    hasher.finish()
    hasher = hasher2
end loop

【讨论】:

  • 是的,这正是我所需要的。复制哈希对象的状态。但是没有方法可以做到这一点。我尝试了这个答案的代码:stackoverflow.com/a/11308879/2183994,但它不起作用。
  • MD5CryptoServiceProvider 使用非托管 API(本机 Windows CSP),因此您无法在 .NET 中克隆它。您需要一个纯 .NET MD5 实现,应该很容易找到。在较旧的 .NET 框架中可能有一个 MD5Managed 类,我记不清了,但您仍然可以找到这样命名的类,例如。这里:archive.msdn.microsoft.com/SilverlightMD5/Wiki/…
猜你喜欢
  • 2020-12-08
  • 2012-07-06
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2012-08-17
相关资源
最近更新 更多