c#快速哈希计算

时间:2009-06-27 00:06:25

标签: c# message-digest

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

之前我将SharpZipLib切换到zlib,性能提升超过2倍。 (好吧,你要注意你有正确的zlib.so或zlib.dll,具体取决于操作系统和硬件,但它会得到回报)。

对于MD5或SHA1是否值得,或者.NET和Mono都依赖本机实现?

(编辑)另外:如果我要坚持使用MD5CryptoServiceProvider,有没有一种方法可以在我阅读时计算文件的哈希值?我的意思是,以块的形式发送字节但仍然计算整个哈希值?

4 个答案:

答案 0 :(得分:16)

MD5和SHA1依赖于本机实现,尽管如此,它可能是一个C ++解决方案+ introp可能会稍微快一点,因为你可能会减少方法调用的数量并优化本机实现。

请记住,Native(SHA1CryptoServiceProvider)可以比托管(SHA1Managed)快3倍。

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数据,这很少是瓶颈。

答案 1 :(得分:3)

SHA1CryptoServiceProvider类使用基础Windows API实现。但是,SHA1Managed非常快。

编辑:是的,可以逐步计算哈希值。 TransformBlockTransformFinalBlock方法执行此操作。

答案 2 :(得分:0)

我只会使用BCL的SHA1MD5CryptoServiceProvider类。框架附带的那些非常快。

答案 3 :(得分:0)

根据您的散列应用程序,MD5可能不适用。 MD5仅用于纠错,它不再可用于检查恶意文件更改。

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

简言之,通过更改文件中的16个字节,可以轻松生成MD5冲突。

相关问题