Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在散列文件时减慢速度_C#_Wcf_Hash_Azure Storage Blobs - Fatal编程技术网

C# 在散列文件时减慢速度

C# 在散列文件时减慢速度,c#,wcf,hash,azure-storage-blobs,C#,Wcf,Hash,Azure Storage Blobs,我正在尝试获取存储在Windows Azure Blob存储区中的文件的哈希 然后我希望将散列与本地机器上存储的版本进行比较,看看是否有差异 下面的代码获取散列 _CloudBlobClient = SetupCloudBlobClient(); CloudBlobContainer cbContainer = _CloudBlobClient.GetContainerReference(sContainer); CloudBlockBlob cb

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

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

谢谢,
Matt

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

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

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

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

我有一种感觉,这可能与此有关,因为我上传了2MB块中的文件,我现在从第一个2MB创建哈希。int length=((int)stream.length>2048000)?2048000:(int)流长度;字节[]缓冲区=新字节[长度];读取(缓冲区,0,长度);字节[]散列=md5.ComputeHash(缓冲区);虽然不太理想,但现在就只能这样了,谢谢你的回复