散列文件时减慢速度

时间:2011-04-04 04:06:38

标签: c# wcf hash azure-storage-blobs

我正在尝试获取存储在Windows Azure Blob Store中的文件的哈希值。

我希望然后将哈希值与本地计算机上存储的版本进行比较,看看是否存在差异。

以下代码获取哈希值。

        _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的文件,对于那些文件,服务只需要太长时间,最终会超时。

我想知道这是否是正确的方法,或者是否有另一种方法可以确定两个文件是否包含相同的数据,这些数据对大文件的处理速度更快。

谢谢, 马特

2 个答案:

答案 0 :(得分:3)

如果我没有弄错,问题是你在这里下载整个文件:

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

这就解释了为什么这会对大文件变得非常慢并且作为解决方案可能不可行 - 我没有任何完美的替代方案但是想法只是生成MD5哈希,即前5 KB的数据并另外比较文件大小 - 如果两者匹配,则假设它们是相同的。

答案 1 :(得分:0)

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