gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:53:19 28 4
gpt4 key购买 nike

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

我试图“玩”一下 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);

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

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

最佳答案

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

  • “System.Security.Cryptography.SHA512CryptoServiceProvider”
  • “System.Security.Cryptography.SHA512Cng”
  • “System.Security.Cryptography.SHA512Managed”

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

关于c# - 为什么 ComputeHash 的执行速度比 certutil -hashfile 慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305407/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com