6

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

以前我将 SharpZipLib 切换到 zlib 并获得了 2 倍以上的性能提升。(好吧,你必须注意你有正确的 zlib.so 或 zlib.dll 取决于操作系统和硬件,但它有回报)。

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

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

4

4 回答 4

16

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

请记住,本机 (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();
        }
    }
}
经过管理的时间 891 毫秒
非托管 已用时间 336 毫秒

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

于 2009-06-27T00:15:16.550 回答
3

该类SHA1CryptoServiceProvider使用底层的 Windows API 实现。不过,SHA1Managed速度还是蛮快的。

编辑:是的,可以逐步计算哈希。TransformBlockTransformFinalBlock方法可以做到这一点。

于 2009-06-27T00:11:25.543 回答
0

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

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

简而言之,MD5 冲突很容易通过更改文件中的 16 个字节来生成。

于 2009-06-27T02:53:24.327 回答
0

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

于 2009-06-27T00:11:52.593 回答