gpt4 book ai didi

c# - 提高 SHA-1 ComputeHash 的性能

转载 作者:太空狗 更新时间:2023-10-29 21:42:02 25 4
gpt4 key购买 nike

我正在使用以下代码对工作正常的文件执行校验和。但是,当我为一个大文件(比如 2 GB)生成哈希时,速度非常慢。我怎样才能提高这段代码的性能?

fs = new FileStream(txtFile.Text, FileMode.Open);
formatted = string.Empty;
using (SHA1Managed sha1 = new SHA1Managed())
{
byte[] hash = sha1.ComputeHash(fs);

foreach (byte b in hash)
{
formatted += b.ToString("X2");
}
}
fs.Close();

更新:

系统:

操作系统:Win 7 64bit,CPU:I5 750,内存:4GB,硬盘:7200rpm

测试:

测试 1 = 59.895 秒

测试 2 = 59.94 秒

最佳答案

第一个问题是您需要此校验和做什么。如果您不需要加密属性,那么非加密散列或加密安全性较低的散列(MD5 被“破坏”并不能阻止它成为一个好的散列,也不足以用于某些用途)是可能性能更高。您可以通过读取数据的一个子集来创建自己的散列(我建议让这个子集在底层文件的 4096 字节 block 中工作,因为这将匹配 SHA1Managed 使用的缓冲区大小,并且允许比 SHA1Managed 更快的 block 读取如果你确实说每个 X 字节代表 X 的某个值,你就会这么做。

编辑:一个让我想起这个答案的投票,也让我想起了我写过 SpookilySharp它提供了非加密的高性能 32 位、64 位和 128 位哈希,但有利于提供针对错误、存储等的校验和。(这反过来提醒我应该更新它以支持 .NET Core) .

当然,如果您希望文件的 SHA-1 与其他东西进行互操作,那您就被卡住了。

我会尝试不同的缓冲区大小,因为增加文件流缓冲区的大小可以以额外内存为代价提高速度。我会建议 4096 的整数倍(顺便说一下,4096 是默认值),因为 SHA1Managed 一次会请求 4096 个 block ,这样就不会出现 FileStream 返回的少于最多请求(允许但有时次优)或一次复制多个副本。

关于c# - 提高 SHA-1 ComputeHash 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3837737/

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