在C#中计算大文件的MD5SUM

11

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

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

通常情况下这个代码工作得很好,但如果我遇到一个大文件(约1GB)-例如iso镜像或DVD VOB文件-我会收到"内存不足"的异常。

然而,我可以在cygwin中为相同的文件计算MD5SUM,大约需要10秒钟。

请建议如何在我的程序中处理大文件。

谢谢

1个回答

29

我建议使用备用方法:

MD5CryptoServiceProvider.ComputeHash(Stream)

只需打开一个在您文件上打开的输入流,即可传递给此方法。这种方法几乎肯定不会一次性将整个文件读入内存。

我还要指出,在大多数MD5实现中,可以一次向摘要函数添加byte[]数据块,然后在最后请求哈希。


3
是的。实际上,Mono通过迭代读取byte[4096] (http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Security.Cryptography/HashAlgorithm.cs?revision=107126&view=markup)来实现ComputeHash(Stream)。 我认为微软的实现非常相似。通常,使用ReadAllBytes可能意味着您正在做错误的事情。即使对于短文件,使用Stream更加优雅。 - Matthew Flaschen
这真是太棒了。我尝试了其他帖子中关于将文件读取到内存流等简单解决方案,但它们都似乎无法处理超大文件。这个方法完美地解决了我的问题,而且非常简单。谢谢 :) - mrduclaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接