我正在寻找本机MD5或SHA1库的ac#wrapper来提高哈希计算性能.
之前我将SharpZipLib切换到zlib,性能提升超过2倍.(好吧,你要注意你有正确的zlib.so或zlib.dll,具体取决于操作系统和硬件,但它会得到回报).
是否值得MD5或SHA1,或者.NET和Mono都依赖本机实现?
(已编辑)另外:如果我要坚持使用MD5CryptoServiceProvider,有没有一种方法可以在我阅读时计算文件的哈希值?我的意思是,以块的形式发送字节但仍然计算整个哈希值?
Sam*_*ron 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
managed Time Elapsed 891 ms unmanaged Time Elapsed 336 ms
另外请记住,除非我的计算错误,非托管实现在大约300毫秒内散列100MB数据,这很少是瓶颈.
该类SHA1CryptoServiceProvider使用底层 Windows API 实现。不过,SHA1Managed速度还是蛮快的。
编辑:是的,可以逐步计算哈希值。和TransformBlock方法TransformFinalBlock执行此操作。
| 归档时间: |
|
| 查看次数: |
8961 次 |
| 最近记录: |