<分区>
在我的应用程序中,我将视频从 Amazon S3 云下载到沙盒。为了确保下载的文件没有损坏,我将对象的 eTag(由亚马逊提供)与驻留在本地文件系统中的下载对象的 MD5 哈希进行比较。对于小视频 (< 5MB),我的算法工作正常 - eTag 和 MD5 哈希是相同的。
对于更大的文件,两个参数不再匹配 - 据我所知,亚马逊为大于 5MB 的文件生成不同的 eTag - eTag 也有一个尾随连字符,后面有一个数字(也许是 block 的数量?):
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()
}
有人知道如何解决这个问题吗? 也许我应该关注另一种方法 - 例如检查下载的视频是否可以打开?