在我的应用程序中,我将视频从 Amazon S3 云下载到沙盒。为了确保下载的文件没有损坏,我将对象的eTag(由Amazon交付(与驻留在本地文件系统中的下载对象的MD5哈希进行比较。对于小视频(<5MB(,我的算法工作正常 - eTag 和 MD5 哈希是相同的。
对于较大的文件,这两个参数不再匹配 - 据我所知,亚马逊为> 5MB 的文件生成 eTag 的方式不同 - eTag 还有一个尾随连字符,后面有一个数字(也许是块的数量?
8c18c4ed68bc9db377cb2d3225c0ee31-4
在互联网上,我找不到为较大文件计算正确MD5哈希的解决方案或代码片段。
计算MD5哈希,我尝试了两者
localData.md5().toHexString() // CryptoSwift
双
var md5: String? {
let hash = localData.withUnsafeBytes { (bytes: UnsafePointer<Data>) -> [UInt8] in
var hash: [UInt8] = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
CC_MD5(bytes, CC_LONG(localData.count), &hash)
return hash
}
return hash.map { String(format: "%02x", $0) }.joined()
}
有没有人知道如何解决这个问题? 也许我应该专注于另一种方法 - 例如检查下载的视频是否可以打开?
我认为更可行的策略是在结构化响应中存储预先计算的哈希(您很可能有一个引用 S3 URL 的 JSON、XML<insert your favourite wire format here>
,不是吗?
{
"url": "https://.../myfile.mpeg",
"sha256": "9e7bf344f14a1fd2f98abbd736fa3c777ef6088e9b964858bbb524e88322a938"
}
依赖 S3 的 ETag 生成算法将在他们决定更改实现时随时中断。此外,CDN 通常处理 ETag 很差,并且 ETag 往往因镜像而异(在一家推出私有 CDN 的公司工作(。因此,如果您决定远离 S3,您的逻辑也可能会被破坏。