我正在使用以下代码对文件进行校验和,效果很好。但是,当我为一个大文件(例如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,RAM:4GB,HDD:7200rpm

测试:

Test1 = 59.895秒

Test2 = 59.94秒

最佳答案

第一个问题是您需要此校验和。如果您不需要加密属性,则使用非加密哈希或加密安全性较差的哈希(MD5被“破坏”并不能阻止其成为良好的哈希,或者对于某些用途仍然不够强大)可能会表现更好。您可以通过读取数据的子集来进行自己的哈希处理(我建议使该子集在基础文件的4096byte块中工作,因为这将与SHA1Managed使用的缓冲区大小匹配,并且允许读取比如果您确实说过每个X字节表示X的某个值,那么您会的。

编辑:对我的回答是赞扬,也让我想起了我,因为我写了SpookilySharp,它提供了高性能的32位,64位和128位哈希,这些哈希不是加密的,但是对于提供针对错误,存储等的校验和很有用。 (这反过来提醒我,我应该对其进行更新以支持.NET Core)。

当然,如果您希望文件的SHA-1与其他文件互操作,则会遇到麻烦。

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

09-27 06:18