我正在寻找本机MD5或SHA1库的c#包装器,以提高哈希计算性能。
之前我将SharpZipLib切换到zlib,性能提升超过2倍。 (好吧,你要注意你有正确的zlib.so或zlib.dll,具体取决于操作系统和硬件,但它会得到回报)。
对于MD5或SHA1是否值得,或者.NET和Mono都依赖本机实现?
(编辑)另外:如果我要坚持使用MD5CryptoServiceProvider,有没有一种方法可以在我阅读时计算文件的哈希值?我的意思是,以块的形式发送字节但仍然计算整个哈希值?
答案 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
非常快。
编辑:是的,可以逐步计算哈希值。 TransformBlock
和TransformFinalBlock
方法执行此操作。
答案 2 :(得分:0)
我只会使用BCL的SHA1和MD5CryptoServiceProvider类。框架附带的那些非常快。
答案 3 :(得分:0)
根据您的散列应用程序,MD5可能不适用。 MD5仅用于纠错,它不再可用于检查恶意文件更改。
http://en.wikipedia.org/wiki/Md5#Vulnerability
简言之,通过更改文件中的16个字节,可以轻松生成MD5冲突。