【问题标题】:Swift, Amazon S3, eTag and MD5 hash for files > 5MB [duplicate]文件大于 5MB 的 Swift、Amazon S3、eTag 和 MD5 哈希 [重复]
【发布时间】:2019-03-17 13:34:33
【问题描述】:

在我的应用程序中,我将视频从 Amazon S3 云下载到沙盒。为了确保下载的文件没有损坏,我将对象的 eTag(由亚马逊提供)与驻留在本地文件系统中的下载对象的 MD5 哈希值进行比较。对于小视频(

对于更大的文件,这两个参数不再匹配 - 据我所知,亚马逊为大于 5MB 的文件生成不同的 eTag - eTag 也有一个尾随连字符,后面有一个数字(可能是块的数量?):

8c18c4ed68bc9db377cb2d3225c0ee31-4

在互联网上,我找不到解决方案或代码 sn-p 计算更大文件的正确 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()
}

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

【问题讨论】:

  • 我没有使用 Amazon S3 的经验,但是根据docs.aws.amazon.com/AmazonS3/latest/API/… 的说法,eTag 可能是 MD5 哈希值。
  • 嗨,马丁,谢谢!我知道这份文件——我确实通过网络界面上传了所有文件——因此我想知道为什么亚马逊生成的电子标签不同。
  • 引用的重复问题的标题是指大于 5GB 的文件,但实际上是指使用分段上传 API 上传的任何文件——这就是触发修改后的 etag 行为的原因。这可用于较小的文件,因为它允许开发人员自行决定上传并行性。对于超过 5 GB 的文件,Multipart 是强制性的,但对于小于 5 MB 的任何大小的文件都是可选的。 (从技术上讲,5MB 以下的文件甚至可以使用 multipart 上传,但部分的数量不能超过 1,因为除了最后一个部分之外的每个部分都必须 >= 5MB)。
  • 有趣的是,许多自动选择上传算法的库(和控制台)似乎会为最小大小在 20 到 100 MB 范围内的文件切换到多部分模式,并将其用于所有更大的文件。

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


【解决方案1】:

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

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

当他们决定更改实现时,依赖 S3 的 ETag 生成算法将随时中断。此外,CDN 通常对 ETag 的处理能力很差,而且 ETag 往往因镜像而异(在一家推出私有 CDN 的公司中工作,情况就是如此)。因此,如果您决定离开 S3,您的逻辑也可能会中断。

【讨论】:

  • 谢谢你,ivanmoskalev!你的想法听起来很棒。正确的是 - 在从 S3 下载视频之前 - 我首先下载一个 JSON 文件,其中包含有关视频的更多信息。因此,为什么不添加 md5 或 sha256 密钥?生成这样的密钥很容易:只需加载终端并运行 md5 或 shasum 命令。另一大优势:我不再依赖提供商的 eTag 算法。
  • @UlrichVormbrock 很高兴我的回答有帮助!如果问题已关闭,请将其标记为已接受,以便问题不再显示为未回答。
  • 好的,我做到了 - 我确实监督了您答案左侧的复选标记。除了你的方法工作正常:我从 JSON 下载指纹并将其放入 CoreData。后来我用下载文件的指纹反核这个指纹。
  • 很高兴它对你有用!
猜你喜欢
  • 2011-09-09
  • 2020-06-19
  • 2015-12-18
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2012-08-24
相关资源
最近更新 更多