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 的数据,这很少会成为瓶颈。