C# C中文件的MD5哈希#

C# C中文件的MD5哈希#,c#,md5,C#,Md5,如何以下一种方式计算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

如何以下一种方式计算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无法帮助完成此任务。

通常情况下,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

不清楚你为什么要这样做。为什么不散列整个文件?为什么每个部分都需要散列?试试这个链接我想按内容比较大量文件,按部分读取这些文件是比较它们的好策略。上次读取部分的校验和不是我需要的,我想得到所有读取文件部分的校验和。是的,这是我需要的。哈希对象的复制状态。但是没有办法做到这一点。我尝试了这个答案中的代码:但它不起作用。MD5CryptoServiceProvider使用非托管API(本机Windows CSP),因此无法在.NET中克隆它。您需要一个纯.NETMD5实现,它应该很容易找到。在较旧的.NET框架中可能有一个MD5Managed类,我记不清了,但您仍然可以找到这样命名的类,例如: