2011-04-04 73 views
2

我試圖獲取存儲在Windows Azure Blob存儲區中的文件的散列。散列文件時速度變慢

我希望能夠將散列與存儲在本地機器上的版本進行比較,以查看是否有區別。

下面的代碼得到散列。

 _CloudBlobClient = SetupCloudBlobClient(); 
     CloudBlobContainer cbContainer = _CloudBlobClient.GetContainerReference(sContainer); 
     CloudBlockBlob cbBlob = cbContainer.GetBlockBlobReference(sBlob); 

     BlobStream stream = cbBlob.OpenRead(); 
     StringBuilder sb = new StringBuilder(); 

     MD5 md5 = MD5CryptoServiceProvider.Create(); 
     byte[] hash = md5.ComputeHash(stream); 
     foreach (byte b in hash) 
      sb.Append(b.ToString("x2")); 

     return sb.ToString(); 

的問題是,這工作正常對於小文件,但我有大於100MB的文件工作,這些文件的服務只是時間過長並最終超時。

我想知道這是否是正確的方法,或者如果有另一種方法來確定兩個文件是否包含相同的數據,這將更快地處理大型文件。

謝謝, 馬特

回答

3

如果我沒有記錯的問題是,你正在下載整個文件位置:

byte[] hash = md5.ComputeHash(stream); 

這就解釋了爲什麼這會得到很大的文件速度很慢,可能是作爲一種解決方案並不可行 - 我沒有任何完美的選擇,但有一個想法是僅生成MD5哈希即前5 KB數據,並且另外比較文件大小 - 如果兩者匹配,則假定它們是相同的。

+0

我有一種感覺,這可能是與這樣做,因爲我上傳的文件在2MB塊我現在從第一個2MB創建散列。 int length =((int)stream.Length> 2048000)? 2048000:(int)stream.Length; byte [] Buffer = new byte [length]; stream.Read(Buffer,0,length); byte [] hash = md5.ComputeHash(Buffer); 這並不理想,但它現在必須做,感謝您的回覆 – Midimatt 2011-04-04 04:29:17

0

也許你可以採取另一種方法。每次存儲和/或覆蓋新文件時,請在任何地方保存版本號(數據庫,其他相關文件,...)。在本地獲取文件時,也可以獲取此版本,因此很容易進行比較。 當然,我不知道你的系統,所以也許這是不可能的...