c# - 可以使用缓冲读取计算 MD5(或其他)哈希值吗?

标签 c# .net-3.5 hash md5 buffer

我需要计算相当大的文件(千兆字节)的校验和。这可以使用以下方法完成:

    private byte[] calcHash(string file)
    {
        System.Security.Cryptography.HashAlgorithm ha = System.Security.Cryptography.MD5.Create();
        FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
        byte[] hash = ha.ComputeHash(fs);
        fs.Close();
        return hash;
    }

但是,文件通常以缓冲方式预先写入(比如一次写入 32mb)。我非常确信我看到了一个哈希函数的覆盖,它允许我在写入的同时计算 MD5(或其他)哈希,即:计算一个缓冲区的哈希,然后将生成的哈希输入下一次迭代.

像这样的东西:(伪代码)

byte [] hash = new byte [] { 0,0,0,0,0,0,0,0 };
while(!eof)
{
   buffer = readFromSourceFile();
   writefile(buffer);
   hash = calchash(buffer, hash);
}

哈希现在类似于通过对整个文件运行 calcHash 函数来完成的事情。

现在,我在 .Net 3.5 Framework 中找不到任何覆盖,我是在做梦吗?它从未存在过,还是我不擅长搜索?同时进行写入和校验和计算的原因是因为文件很大,所以这样做很有意义。

最佳答案

您使用 TransformBlockTransformFinalBlock 方法以 block 的形式处理数据。

// Init
MD5 md5 = MD5.Create();
int offset = 0;

// For each block:
offset += md5.TransformBlock(block, 0, block.Length, block, 0);

// For last block:
md5.TransformFinalBlock(block, 0, block.Length);

// Get the has code
byte[] hash = md5.Hash;

注意:将所有 block 发送到 TransformBlock 然后将一个空 block 发送到 TransformFinalBlock 以完成该过程(至少对于 MD5 提供程序)是有效的。

关于c# - 可以使用缓冲读取计算 MD5(或其他)哈希值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2124468/

相关文章:

c# - 在 ushort 中设置位范围

c# - 在 C# 中将 reg 值写入本地计算机

c# - 需要相互排斥

c# - 多线程更新数组

c# - Response.Redirect - 如果当前页面具有带哈希的目标 URL 的 URL,则使用哈希发送重定向时出现问题

.net - 采用 .net 3.5 框架的温莎城堡

php - 当安全性不受威胁时,php 中可用的最高性能散列算法是什么?

c# 在 chrome 中使用哈希 (#) 打开 url

java - 线性探测哈希表中数组 M 的大小应该有多大?

c# - 使用类作为事件标识符