c# - 如何在不读取同一个文件两次的情况下计算两个哈希值?

标签 c# hash md5 sha1

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

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

请详细解释,因为我不是经验丰富的编码人员。

最佳答案

当然。你可以反复调用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.CreateSHA1Cng.Create 调用将围绕 native 实现创建包装器,这可能比 MD5.Create< 返回的实现更快SHA1.Create,但它的可移植性会差一点(例如,对于 PCL)。

关于c# - 如何在不读取同一个文件两次的情况下计算两个哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904537/

相关文章:

c# - Linphone SDK 集成在 Xamarin Android 中返回未知程序集

javascript - Fetch API 调用导致新的 Asp.net session

c# - 如何使用 C# 取消散列?

c# - 释放输出比 Debug : MD5CryptoServiceProvider. ComputeHash() 慢

couchdb - CouchDB 附件的 md5 摘要格式是什么?

security - MD5 哈希加盐 - 在哪里存储盐

c# - C#中的遍历路径

c# - 如何在 MVC htmlAttribute 中设置禁用

java - 使用 mod 对 id 进行分区的良好哈希函数

java - 生成多对一映射的算法/哈希函数