【问题标题】:Slow down when hashing a file散列文件时放慢速度
【发布时间】:2011-07-28 21:56:09
【问题描述】:

我正在尝试获取存储在 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 的文件,而对于这些文件,服务需要的时间太长,最终会超时。

我想知道这是否是正确的方法,或者是否有另一种方法来确定两个文件是否包含相同的数据,这对于大文件来说会更快。

谢谢, 马特

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我感觉这可能与此有关,因为我以 2MB 的块上传文件,我现在正在从前 2MB 创建散列。整数长度 = ((int)stream.Length > 2048000) ? 2048000 : (int)stream.Length;字节[] 缓冲区 = 新字节[长度]; stream.Read(缓冲区,0,长度); byte[] hash = md5.ComputeHash(Buffer);这不是很理想,但现在必须这样做,谢谢您的回复
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2014-10-28
      相关资源
      最近更新 更多