gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:20:01 26 4
gpt4 key购买 nike

我有一个程序将用于非常大的文件(当前测试数据为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com