Silverlight用于大型文件的高效哈希

Silverlight用于大型文件的高效哈希,silverlight,algorithm,hash,performance,Silverlight,Algorithm,Hash,Performance,在我的silverlight应用程序中,我必须为一个大文件(>2Gb)生成哈希 手术需要很多时间。我的代码如下所示: public static string GetFileHash(FileInfo file) { FileStream fs = file.OpenRead(); SHA256 shaM = new SHA256Managed(); var result = BitConverter.ToS

在我的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中,我没有发出缓冲流

你知道哈希算法有什么有效的实现方法吗?我试过md5。。。但silverlight不支持它

非常感谢, Radu D是的,操作将花费相当多的时间-它必须检查所有文件!您是否查看了计算机的性能监视器以查看是否使用了大量CPU?我怀疑您真的是IO绑定的,这只是尝试读取所有大文件以对其进行散列的自然结果


您是否尝试过在同一文件上运行任何其他哈希(例如,使用md5sum工具)以查看是否更快?如果它的速度更快,我会感到惊讶。

要散列文件,代码必须读取整个文件,这需要一些时间。现代硬盘的工作速度大约为100 MB/s(可能更快,但更昂贵),因此2 GB的文件至少需要20秒

SHA-256不是最快的哈希函数,Silverlight中的托管代码也不是最快的实现技术。实际上,在2.4 GHz Core2 PC上,您可能会期望达到60 MB/s(这是我在PC上使用.NET 4.0中的独立VM时得到的结果;我可以用我自己的SHA-256托管实现比这快一点,比如75 MB/s)。这还不错,但仍然比硬盘速度低一点


如果您碰巧在64位模式下运行,那么您可能希望尝试SHA-512,它在64位体系结构上比SHA-256快(但在32位系统上要慢得多)。或者,您可能希望尝试使用一些本机代码。还有其他散列函数,但有些散列函数在加密方面被破坏(例如MD5),因此,根据您的情况,您可能想尝试,也可能不想尝试。SHA-1比SHA-256更快,由Silverlight支持,并且在加密方面“减弱”(尚未完全破坏,但不如其应有的健壮性),因此,如果它用于任何与安全相关的应用程序,则不建议用于新应用程序。无论如何,不管您实现了什么样的哈希函数,您很快就会达到硬盘带宽限制。

我的问题是,我想在服务器上测试文件是否存在。除了散列函数,您还知道其他实现方法吗?如果您想知道给定文件是否也“在服务器上”具有相同的内容,那么有时您必须读取文件内容。散列是好的,不是这里的问题;问题在于读取整个文件。您可以通过先查看文件长度(如果服务器没有完全相同长度的文件,则您无需读取整个文件即可获得答案)或尝试散列(例如,文件的前10MB)来避免读取;但如果怀疑匹配,你必须完整地阅读(并将其散列)。