我有一个程序将用于非常大的文件(当前测试数据为250GB)。我需要能够为这些文件计算MD5和SHA1哈希值。目前我的代码将流丢弃到MD5.Create()。ComputeHash(Stream stream),然后是SHA1的相同内容。据我所知,这些文件以4096字节块的形式读取到散列函数内部的缓冲区,直到流的末尾。
问题是,一个接一个地做这个需要很长时间!在将新块读入缓冲区之前,有什么办法可以将数据放入缓冲区并为BOTH算法提供缓冲区吗?
请完整解释,因为我不是一位经验丰富的编码员。
答案 0 :(得分: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.Create
和SHA1Cng.Create
调用将围绕本机实现创建包装器,这些包装器可能比MD5.Create
和SHA1.Create
返回的实现更快,但这将是一个便携性较差(例如用于PCL)。