2011-04-04 72 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

也许你可以采取另一种方法。每次存储和/或覆盖新文件时,请在任何地方保存版本号(数据库,其他相关文件,...)。在本地获取文件时,也可以获取此版本,因此很容易进行比较。 当然,我不知道你的系统,所以也许这是不可能的...