为什么 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)
,并比较结果。
我正在寻找计算大文件 (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)
,并比较结果。