在我的silverlight应用程序中,我必须为大文件生成哈希值(> 2Gb) 这项行动耗费了大量时间。我的代码如下:
public static string GetFileHash(FileInfo file)
{
FileStream fs = file.OpenRead();
SHA256 shaM = new SHA256Managed();
var result = BitConverter.ToString(shaM.ComputeHash(fs));
return result;
}
我认为问题在于我没有使用缓冲流。在Silverlight中,我没有使用BufferedStream。
您知道哈希算法的任何有效实现吗?我试过md5 ......但是在silverlight中不支持它。
非常感谢, Radu D
答案 0 :(得分:3)
是的,操作将花费相当多的时间 - 它必须检查所有文件!您是否查看过计算机的性能监视器,看看您是否使用了大量CPU?我怀疑你确实 IO-bound,并且这只是尝试读取所有大文件以使其散列的自然结果。
您是否尝试在同一个文件上运行任何其他哈希值(例如使用md5sum工具)以查看它是否更快?如果从根本上更快,我会感到惊讶。
答案 1 :(得分:0)
要散列代码必须读取整个文件的文件,这需要一些时间。现代硬盘可以以大约100 MB / s的速度运行(可能更快但更昂贵),因此2 GB文件将至少 20秒。
SHA-256不是最快的哈希函数,Silverlight中的托管代码并不是有史以来最快的实现技术。实际上,你可以期待60 MB / s的2.4 GHz Core2 PC(这就是我在PC上使用.NET 4.0的独立虚拟机所获得的;我可以做得比这快一点 - 比如75 MB / s - 使用我自己的SHA-256托管实现)。这还不错,但仍然比硬盘速度低一点。
如果您碰巧在64位模式下运行,那么您可能需要尝试使用SHA-512,这在64位架构上比SHA-256更快(但在32位系统上速度要慢得多)。或者,您可能想尝试使用一些本机代码。还有其他哈希函数,但有些是加密破坏的(例如MD5),因此,根据您的情况,您可能想也可能不想尝试它们。 SHA-1比SHA-256更快,受Silverlight支持,并且加密“弱化”(尚未完全破坏,但不如它应该的那样强大),因此如果它用于任何东西,不推荐用于新应用程序这与安全有关。无论如何,无论您实现的散列函数如何,您都将很快达到硬盘带宽限制。