为什么 ComputeHash 的执行速度比 certutil -hashfile 慢得多?

Why does ComputeHash perform much slower then certutil -hashfile?

我正在寻找计算大文件 (3GB) 哈希的有效方法,并意识到使用参数 -hashfile 调用 Windows certutil 执行哈希计算比执行哈希计算快 4 倍(16 秒)通过 SHA512.Create().ComputeHash(~60 秒)我不是很理解这么大的差异。

我试图 'play' 读取缓冲区大小 FileStream 但它给了我大约 2 秒所以不是很重要的优化。

1) 通过ComputeHash进行哈希计算:

var sw = Stopwatch.StartNew();
using (var fs = new FileStream(@"C:\Temp\BigFile.dat", FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 1024 * 1024 * 10, options: FileOptions.SequentialScan))
{
    Console.WriteLine(BitConverter.ToString(SHA512.Create().ComputeHash(fs)));
}
Console.WriteLine(sw.ElapsedMilliseconds);

2) 通过 certutil

var sw = Stopwatch.StartNew();
var fPath = @"C:\Temp\BigFile.dat";
var p = Process.Start(new ProcessStartInfo(@"certutil", $"-hashfile \"{fPath}\" SHA512") { RedirectStandardOutput = true, UseShellExecute=false});
p.WaitForExit();
Console.WriteLine(p.StandardOutput.ReadToEnd());
Console.WriteLine(sw.ElapsedMilliseconds);

由于 managed/native 代码的性质,我预计时间会有一些差异,但 16 秒与 60 秒看起来有点混乱。

this question 还提到本机代码工作得更快,但没有解释这种差异,我最感兴趣的是理解这种差异。我在想,现在这么简单的例子(IO +数学?)应该不会有这么大的区别

SHA512在.NET中的三种实现方式(默认取决于CryptoConfig.AllowOnlyFipsAlgorithms 属性):

  • "System.Security.Cryptography.SHA512CryptoServiceProvider"
  • "System.Security.Cryptography.SHA512Cng"
  • "System.Security.Cryptography.SHA512Managed"

可能是这些实现具有不同的性能。对每个字符串调用 SHA512.Create(string),并比较结果。