一尘不染

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

c#

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

    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(或其他)哈希,即:计算一个缓冲区的哈希,然后将得到的哈希输入到下一个迭代中。

像这样的东西:(pseudocode-ish)

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中找不到类似的替代项,我在做梦吗?它从来没有存在过,还是我在搜索时很烂?一次进行写入和校验和计算的原因是由于文件大而有意义。


阅读 253

收藏
2020-05-19

共1个答案

一尘不染

您可以使用TransformBlockTransformFinalBlock方法来分块处理数据。

// 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;

注意:它可以(至少与MD5提供程序一起使用)将所有块发送到TransformBlock,然后向其发送空块TransformFinalBlock以完成该过程。

2020-05-19