可能重复:
Possible to calculate MD5 (or other) hash with buffered reads?
我正在对usb闪存驱动器的整个原始内容执行md5校验和。
我正在以1 MB的块读取驱动器。很明显,我不会长时间保持缓冲区,因为我会很快耗尽内存。
我想将1 MB的块发送到md5算法,因为它们被读取,当我读完时,得到md5的最终值。
是否有可以轻松实现此目的的C#代码?
答案 0 :(得分:1)
此方法会一次计算input
阅读BufferSize
byte
的哈希值:
static byte[] CalculateHash(Stream input, HashAlgorithm algorithm)
{
byte[] buffer = new byte[BufferSize];
int readCount;
while ((readCount = input.Read(buffer, 0, BufferSize)) > 0)
algorithm.TransformBlock(buffer, 0, readCount, buffer, 0);
algorithm.TransformFinalBlock(buffer, 0, readCount);
return algorithm.Hash;
}
请注意,它采用HashAlgorithm
类型的参数,因此您可以计算除MD5之外的哈希值。这样称呼:
using (FileStream inputStream = new FileStream(InputPath, FileMode.Open))
using (MD5 algorithm = MD5.Create())
{
byte[] md5Hash = CalculateHash(inputStream, algorithm);
string md5HashHex = string.Join(string.Empty, md5Hash.Select(b => b.ToString("x2")));
// Process hash array or hex string...
}
答案 1 :(得分:0)
这似乎与您尝试的有点不同,但是我在传输大型文件时做了类似的事情。
首先我构建一个清单文件,它是要发送的文件的每个块的列表,它的顺序,它是md5哈希。我将该文件发送到接收过程。
然后我开始发送文件块,接收器,获取它们,验证它们的哈希值,并将它们排队等待重新组装。如果一个块与它的哈希不匹配,它将被丢弃,并且会再次传递该块的请求。
一旦接收并验证了所有块,就会重新组装文件,并根据清单中的完整文件哈希检查完整文件。如果一切看起来都不错,我们会将成功的回复发送给发件人。
这让我可以一次处理并验证文件的各个部分,但它不允许我根据较小源的哈希值构建哈希值。我不相信这是可能的,仅仅是哈希算法的本质。
@ ken2k对您的问题发表评论+1。 md5.TransformBlock()
和md5.TransformFinalBlock()
可能正是您正在寻找的。我不知道存在这样的事情。