在C#中计算大文件的MD5SUM

spk*_*ira 11 c# hash md5 large-files

我使用以下代码来计算文件的MD5SUM -

byte[] b = System.IO.File.ReadAllBytes(file);
string sum = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(b));
Run Code Online (Sandbox Code Playgroud)

这通常工作正常,但如果我遇到一个大文件(~1GB) - 例如ISO映像或DVD VOB文件 - 我得到一个Out of Memory异常.

虽然,我能够在cygwin中为大约10秒的同一文件计算MD5SUM.

请建议如何让我的程序中的大文件工作.

谢谢

Aln*_*tak 29

我建议使用替代方法:

MD5CryptoServiceProvider.ComputeHash(Stream)
Run Code Online (Sandbox Code Playgroud)

并传入一个在您的文件上打开的输入流.这种方法几乎肯定不会一次性读入内存中的整个文件.

我还要注意,在MD5的大多数实现中,可以一次将byte[]数据添加到摘要函数块中,然后在最后请求散列.

  • 是的.Mono实际上通过迭代读取一个字节来实现ComputeHash(Stream)[4096](http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Security.Cryptography/HashAlgorithm.cs?修订= 107126&视图=标记).我希望MS的实现非常相似.通常,使用ReadAllBytes可能意味着你做错了什么.即使对于短文件,使用Stream也更优雅. (3认同)