代码之家  ›  专栏  ›  技术社区  ›  pablo

c#快速哈希计算

  •  6
  • pablo  · 技术社区  · 17 年前

    我正在寻找本地MD5或SHA1库的c#包装器,以提高哈希计算性能。

    以前我把SharpZipLib换成zlib,性能提升了两倍多。(好吧,你要小心你有权利兹利布索或者zlib.dll取决于操作系统和硬件,但这是值得的)。

    (已编辑)另外:如果我必须坚持使用MD5CryptoServiceProvider,是否有一种方法可以在读取文件时计算文件的哈希值?我的意思是,成批发送字节,但仍然计算整个散列?

    4 回复  |  直到 17 年前
        1
  •  16
  •   Sam Saffron James Allen    17 年前

    MD5和Sa1依赖于本地实现,但是它可能的C++解决方案+ IntPp可能稍快,因为您可能会减少方法调用的数量,并优化本机实现。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Security.Cryptography;
    
    namespace ConsoleApplication22 {
    
    
    
        class Program {
    
            static void Profile(string description, int iterations, Action func) {
    
                // clean up
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
    
                // warm up 
                func();
    
                var watch = Stopwatch.StartNew();
                for (int i = 0; i < iterations; i++) {
                    func();
                }
                watch.Stop();
                Console.Write(description);
                Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
            }
    
            static void Main() {
                SHA1Managed managed = new SHA1Managed();
                SHA1CryptoServiceProvider unmanaged = new SHA1CryptoServiceProvider();
    
                Random rnd = new Random();
    
                var buffer = new byte[100000];
                rnd.NextBytes(buffer);
    
                Profile("managed", 1000, () => {
                    managed.ComputeHash(buffer, 0, buffer.Length);
                });
    
                Profile("unmanaged", 1000, () =>
                {
                    unmanaged.ComputeHash(buffer, 0, buffer.Length);
                });
    
                Console.ReadKey();
            }
        }
    }
    
    managed Time Elapsed 891 ms
    unmanaged Time Elapsed 336 ms
    

    也要记住 除非我的计算是错误的,否则非托管实现将在大约300毫秒内散列100MB的数据,这很少会成为瓶颈。

        2
  •  3
  •   Mehrdad Afshari    17 年前

    这个 SHA1CryptoServiceProvider SHA1Managed 速度很快。

    TransformBlock 和 TransformFinalBlock

        3
  •  0
  •   Reed Copsey    17 年前

    我会用BCL的 SHA1 和 MD5CryptoServiceProvider 班级。与框架一起发布的那些是相当快的。

        4
  •  0
  •   clemahieu    17 年前

    根据散列的应用,MD5可能不适用。MD5只在纠错中有用,它不再适用于检查恶意文件更改。

    http://en.wikipedia.org/wiki/Md5#Vulnerability

    推荐文章