如何根据正在读取的数据块计算md5

本文关键字:数据 计算 md5 读取 何根 | 更新日期: 2023-09-27 18:25:47

可能重复:
是否可以使用缓冲读取计算MD5(或其他)哈希?

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

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

我想在读取时将1MB的块发送到md5算法,当我完成读取时,获得md5的最终值。

有没有任何C#代码可以轻松地实现这一点?

如何根据正在读取的数据块计算md5

此方法将计算input一次读取BufferSize byte s的哈希:

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...
}

这似乎与您尝试的有点不同,但我在跨线传输大型文件时也做了类似的操作。

首先,我构建了一个清单文件,它是要发送的文件的每个块的列表、顺序和md5哈希。我将该文件发送到接收过程。

然后,我开始发送文件块,接收器获取它们,验证它们的哈希,并将它们排队以进行重新组装。如果一个区块与它的哈希不匹配,它就会被丢弃,并请求再次传递该区块。

一旦接收并验证了所有块,就重新组装文件,并根据清单中的完整文件哈希检查完整文件。如果一切看起来都很好,我们会向发件人发送一个成功的响应。

这让我一次只处理和验证一个文件的片段,但它不允许我从较小源的哈希值构建哈希。我认为这是不可能的,只是由于哈希算法的性质。

编辑

+1表示@ken2k对您问题的评论。md5.TransformBlock()md5.TransformFinalBlock()可能正是您想要的。我根本不知道有这样的事情存在。