C++实现Azure上传文件的MD5校验问题咨询
Azure Blob上传MD5校验问题解答
问题1:本地计算哈希与Azure返回值不相等的原因及解决方法
你代码里的问题出在两个关键点:
- 哈希对象选错了:
TransactionalContentHash是Azure返回的分块上传中单个块的哈希值,而你本地计算的是整个文件的MD5,两者属于不同维度的哈希,自然不会相等。你应该使用res.Value.ContentHash,这个字段才对应整个Blob的MD5哈希。 - 哈希编码不匹配:Azure返回的
ContentHash值是Base64编码后的字符串,而你本地md5Hash.Final()得到的是原始字节数组,直接对比肯定不相等,需要统一编码格式后再进行对比。
修正后的代码示例:
auto cClient = client.GetBlobContainerClient(cName); auto bClient = cClient.GetBlockBlobClient(bName); auto res = bClient.UploadFrom(reinterpret_cast<const std::uint8_t *>(buffer), bufferSize); Azure::Core::Cryptography::Md5Hash md5Hash; md5Hash.Append(reinterpret_cast<const std::uint8_t *>(buffer), bufferSize); auto localRawHash = md5Hash.Final(); // 方式1:本地哈希转Base64后对比 auto localBase64Hash = Azure::Core::Convert::Base64Encode(localRawHash); if (localBase64Hash != res.Value.ContentHash.Value().Value) { std::cout << "哈希不匹配" << std::endl; } else { std::cout << "哈希匹配" << std::endl; } // 方式2:将Azure返回的哈希解码为原始字节后对比 auto remoteRawHash = Azure::Core::Convert::Base64Decode(res.Value.ContentHash.Value().Value); if (localRawHash != remoteRawHash) { std::cout << "哈希不匹配" << std::endl; } else { std::cout << "哈希匹配" << std::endl; }
问题2:上传时传入MD5让Azure自动校验
使用UploadFrom的重载版本,通过UploadBlockBlobOptions传入本地计算好的MD5哈希,Azure会在服务器端计算上传内容的MD5并进行对比,不匹配则直接返回错误,拒绝完成上传。
代码示例:
auto cClient = client.GetBlobContainerClient(cName); auto bClient = cClient.GetBlockBlobClient(bName); // 预计算本地内容的MD5哈希 Azure::Core::Cryptography::Md5Hash md5Hash; md5Hash.Append(reinterpret_cast<const std::uint8_t *>(buffer), bufferSize); auto localHash = md5Hash.Final(); // 配置上传选项,设置ContentHash字段 Azure::Storage::Blobs::UploadBlockBlobOptions uploadOptions; uploadOptions.ContentHash = localHash; try { auto res = bClient.UploadFrom(reinterpret_cast<const std::uint8_t *>(buffer), bufferSize, uploadOptions); std::cout << "上传成功,哈希校验通过" << std::endl; } catch (const Azure::Core::RequestFailedException& ex) { // 哈希不匹配时会抛出异常,错误码通常为400 std::cout << "上传失败:" << ex.what() << std::endl; }
内容的提问来源于stack exchange,提问作者Jakomo
相关产品推荐
相关产品推荐

