如何在读取数据时从数据块计算md5

时间:2012-02-24 16:22:20

标签: c# md5

  

可能重复:
  Possible to calculate MD5 (or other) hash with buffered reads?

我正在对usb闪存驱动器的整个原始内容执行md5校验和。

我正在以1 MB的块读取驱动器。很明显,我不会长时间保持缓冲区,因为我会很快耗尽内存。

我想将1 MB的块发送到md5算法,因为它们被读取,当我读完时,得到md5的最终值。

是否有可以轻松实现此目的的C#代码?

2 个答案:

答案 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()可能正是您正在寻找的。我不知道存在这样的事情。