快速计算未路径中文件的MD5

时间:2017-08-28 02:40:56

标签: c# md5

我需要为UNC文件夹(\\ 192.168.1.3 \ ABC)中的每个文件计算md5。问题是这个文件夹有大量文件(~2000个文件) 下面这段代码需要2.5个小时才能完成。

 foreach (var file in filesInFolder)
 {
    using (var md5 = MD5.Create())
     {
       using (var stream = File.OpenRead(file))
        {
           var md5Check = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "‌​").ToLower();
           dicMD5[file] =md5Check;
        }
     }
 }

如果ABC是本地文件夹,则需要大约5分钟才能完成上述代码。 我认为我需要一些帮助以获得更好的方法。请帮助我多多谢谢

2 个答案:

答案 0 :(得分:0)

因此,由于它在大约5分钟内在本地运行,因此该问题可能与通过网络读取文件有关。加快速度的最佳方法是将程序置于文件所在的本地,并在必要时将结果传达给另一台机器。我意识到有些时候它不起作用,所以这限制了你可以做的事情。

你可以做的一件事是调用所有文件的多线程。

var maxThreads = 8;

Parallel.ForEach(filesInFolder, new ParallelOptions { MaxDegreeOfParallelism = maxThreads }, file => { 
    using (var md5 = MD5.Create()) {
        using (var stream = File.OpenRead(file)) {
            var md5Check = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "‌​").ToLower();
            dicMD5[file] = md5Check;
        }
    }
});            

这将并行运行所有内容,受maxThreads变量限制。

我使用此代码在2分钟内计算17k文件的哈希值。因此,尽管在网络上这可能仍然较慢,但它应该比您目前正在做的快得多。只需确保将maxThreads设置为适合您机器的值。

注意:您可能希望将dicMD5设为ConcurrentDictionary。这可以在System.Collections.Concurrent

找到

答案 1 :(得分:0)

将文件复制到本地计算机需要多长时间?如果耗时2.5小时,那就没有效率低,除了尝试在远程机器上运行代码之外,你无能为力。

如果副本花费的时间少于2.5小时,那么您就知道过程中的某些地方效率低下 - 例如,缓冲区太小或者数据被重复提取。如果是这种情况,最简单的解决方案是将每个文件复制到本地临时目录,然后执行校验和。如果您希望它尽可能快地运行,请使用复制文件的线程和计算校验和的一个或多个线程,这样您就不必在复制下一个文件之前等待校验和完成。