4

我有一个程序将用于非常大的文件(当前测试数据为 250GB)。我需要能够计算这些文件的 MD5 和 SHA1 哈希值。目前我的代码将流放入 MD5.Create().ComputeHash(Stream stream),然后对于 SHA1 也是如此。据我所知,这些以 4096 字节块的形式将文件读取到散列函数内部的缓冲区,直到流结束。

问题是,一个接一个地做这个需要很长时间!在将新块读入缓冲区之前,有什么方法可以将数据放入缓冲区并将缓冲区提供给两种算法?

请彻底解释,因为我不是经验丰富的编码器。

4

1 回答 1

10

当然。您可以TransformBlock反复调用,然后TransformFinalBlock在结束时再使用Hash以获取最终哈希。所以像:

using (var md5 = MD5.Create()) // Or MD5Cng.Create
using (var sha1 = SHA1.Create()) // Or SHA1Cng.Create
using (var input = File.OpenRead("file.data"))
{
    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length()) > 0)
    {
        md5.TransformBlock(buffer, 0, bytesRead, buffer, 0);
        sha1.TransformBlock(buffer, 0, bytesRead, buffer, 0);
    }
    // We have to call TransformFinalBlock, but we don't have any
    // more data - just provide 0 bytes.
    md5.TransformFinalBlock(buffer, 0, 0, buffer, 0);
    sha1.TransformFinalBlock(buffer, 0, 0, buffer, 0);

    byte[] md5Hash = md5.Hash;
    byte[] sha1Hash = sha1.Hash;
}

MD5Cng.Createand调用将围绕本机实现创建包装器,这可能比andSHA1Cng.Create返回的实现更快,但可移植性较差(例如,对于 PCL)。MD5.CreateSHA1.Create

于 2013-02-15T22:41:47.840 回答