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

C# 为什么ComputeHash的执行速度比certutil-hashfile慢得多?,c#,hash,filestream,unmanaged,managed,C#,Hash,Filestream,Unmanaged,Managed,我正在寻找计算大文件散列(3GB)的有效方法,并意识到使用参数-hashfile调用Windows certutil比通过SHA512.Create().ComputeHash(~60秒)执行散列计算要快4倍(16秒),我真的不理解这么大的差异 我试图“玩”读取缓冲区大小FileStream,但它给了我大约2秒的时间,所以这并不是真正重要的优化 1) 通过ComputeHash执行哈希计算: var sw = Stopwatch.StartNew(); using (var fs = new F

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

我试图“玩”读取缓冲区大小
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);
由于代码的托管/本机性质,我希望在时间上有所不同,但16秒对60秒看起来有点混乱


此外,还提到本机代码的工作速度要快得多,但没有解释这种差异,我最感兴趣的是理解这种差异。我当时在想,在当今这个简单的例子(IO+math?)中不应该有这么大的区别。

在.NET中有三种SHA512的实现(默认值取决于
CryptoConfig.allownlyFipsalgorithms
属性):

  • “System.Security.Cryptography.SHA512CryptoServiceProvider”
  • “系统.安全.加密.SHA512Cng”
  • “系统、安全、加密、SHA512管理”

这些实现可能具有不同的性能。调用
SHA512。使用每个字符串创建(字符串)
,并比较结果。

的可能重复项我认为这不是上述问题的重复项。请尝试一种特定的
SHA512
实现
SHA512Managed
SHA512Cng
SHA512CryptoServiceProvider
?(或者只需执行例如
new SHA512Cng()
)也只需检查
SHA512Managed
,以防
SHA512.Create()
给您
SHA512Cng
。并不是说我对它有特别高的期望,但它值得确保。没有
SHA512CryptoServiceProvider.Create
-您只需调用
SHA512.Create()
,这将给您
SHA512管理的
/
SHA512Cng
@PavelAsedovski完全按照编写的
SHA512.Create(string)
,其中,
string
是上面提到的其中一个,与所写的完全一样。@canton7我正忙于写作和调查。而且在这方面也失败了。但是,下面是投票时的评论。