我需要计算很大文件(千兆字节)的校验和。可以使用以下方法完成此操作:
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中找不到类似的替代项,我在做梦吗?它从来没有存在过,还是我在搜索时很烂?一次进行写入和校验和计算的原因是由于文件大而有意义。
您可以使用TransformBlock和TransformFinalBlock方法来分块处理数据。
TransformBlock
TransformFinalBlock
// 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以完成该过程。