文件大于5MB的Swift,Amazon S3,eTag和MD5哈希值

时间:2018-10-12 10:25:31

标签: swift amazon-web-services amazon-s3 md5 etag

在我的应用程序中,我将视频从Amazon S3云下载到沙箱。为了确保下载的文件没有损坏,我将对象的eTag(由Amazon交付)与驻留在本地文件系统中的下载对象的MD5哈希值进行了比较。对于小型视频(<5MB),我的算法可以正常工作-eTag和MD5哈希相同。

对于较大的文件,这两个参数不再匹配-据我所知,Amazon对于大于5MB的文件生成eTag的方式有所不同-eTag后面还有一个连字符,后面带有数字(也许是块的数量?):

8c18c4ed68bc9db377cb2d3225c0ee31-4

在Internet上,找不到用于计算较大文件的正确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()
}

有人知道如何解决此问题吗? 也许我应该专注于另一种方法-例如检查下载的视频是否可以打开?

1 个答案:

答案 0 :(得分:0)

我认为一种更可行的策略是在结构化响应中存储预先计算的哈希(您很可能具有引用S3 URL的JSON,XML,<insert your favourite wire format here>,不是吗?)。

  {
    "url": "https://.../myfile.mpeg",
    "sha256": "9e7bf344f14a1fd2f98abbd736fa3c777ef6088e9b964858bbb524e88322a938"
  }

当他们决定更改实现时,依赖S3的ETag生成算法将随时中断。另外,CDN通常处理ETag的能力很差,并且ETag的镜像差异很大(在一家使用私有CDN的公司中工作过)。因此,如果您决定退出S3,您的逻辑也可能会中断。