2011-04-06 55 views
2

在我的silverlight應用程序中,我必須爲大文件生成哈希(> 2Gb) 該操作花費了大量時間。我的代碼如下所示:大文件的Silverlight高效哈希

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不支持它。

非常感謝, 拉杜d

+0

請參閱http://stackoverflow.com/questions/4206219/md5-hash-in-silverlight – WhiteFang34 2011-04-06 06:53:14

回答

0

哈希文件的代碼必須讀取整個文件,這將需要一些時間。現代硬盤可能以大約100 MB/s的速度運行(速度可能更快但價格更貴),因此2 GB的文件至少需要花費20秒鐘的時間才能完成。

SHA-256不是哈希函數中最快的,並且Silverlight中的託管代碼並不是有史以來最快的實現技術。實際上,你可以預計,使用2.4 GHz Core2 PC可達到60 MB/s(這是我在PC上使用.NET 4.0的獨立VM所獲得的結果;我可以做得比這更快 - 比如說75 MB/s - 用我自己的SHA-256管理實現)。這並不壞,但仍然低於硬盤速度。

如果您碰巧在64位模式下運行,那麼您可能需要嘗試在64位體系結構上比SHA-256更快的SHA-512(但在32位系統上速度明顯更慢)。另外,你可能想嘗試使用一些本地代碼。還有其他的散列函數,但有些散列函數是加密破解的(例如MD5),因此,根據您的情況,您可能會也可能不想嘗試它們。 SHA-1比Silverlight支持的SHA-256更快,並且加密地「減弱」(尚未完全破碎,但不像它應該那樣健壯),所以如果它用於任何東西,則不推薦用於新應用程序這與安全性有關。無論如何,無論您實施的哈希函數如何,您都會很快達到硬盤帶寬限制。

+0

我的問題實際上是我想在服務器上測試如果文件存在。你知道任何其他的方式來實現這個,而不是哈希函數? – 2011-04-07 07:29:43

+0

如果你想知道一個給定的文件是否也是「在服務器上」的內容相同,那麼有時你需要閱讀文件內容。散列很好,這裏不是問題;問題是關於閱讀整個文件。您可以嘗試通過首先查看文件長度來避免讀取(如果服務器沒有長度完全相同的文件,則無需讀取整個文件就可以得到答案)或嘗試散列,例如,前10 MB文件;但是如果發生疑似匹配,你將不得不把它整個讀出來(並且把它散列)。 – 2011-04-07 12:04:49

3

是,操作需要相當多的時間 - 它有檢查所有的文件!你看過你的計算機的性能監視器,看看你是否使用了大量的CPU?我懷疑你是真的 IO綁定,並且這只是嘗試讀取所有大文件以散列它的自然結果。

您是否試過在同一個文件上運行任何其他散列(例如使用md5sum工具)以查看這是否更快?我會很驚訝,如果它從根本上更快