[软件设计/软件工程] 为大于 5GB 的文件计算 Amazon-S3 Etag 的算法是什么?

[复制链接]
发表于 2022-5-3 12:04:29
问题
上传到 Amazon S3 的小于 5GB 的文件有一个 ETag,它是文件的 MD5 哈希值,可以轻松检查您的本地文件是否与您放在 S3 上的文件相同。

但是如果你的文件大于 5GB,那么亚马逊会以不同的方式计算 ETag。

例如,我对一个 5970150664 字节的文件进行了 380 个部分的分段上传。现在 S3 显示它有一个 ETag 6bcf86bed8807b8e78f0fc6e0a53079d-380 。我的本地文件的 md5 哈希是 702242d3703818ddefe6bf7da2bed757 。我认为破折号后的数字是分段上传中的部分数。

我还怀疑新的 ETag(破折号之前)仍然是 MD5 哈希,但在分段上传期间以某种方式包含一些元数据。

有谁知道如何使用与 Amazon S3 相同的算法计算 ETag?

回答
刚刚确认了一个。向亚马逊致敬,让事情变得容易猜到。

假设您上传了一个 14MB 的文件,而您的小部件大小为 5MB。计算每个部分对应的 3 个 MD5 校验和,即前 5 MB、后 5 MB 和后 4 MB。然后校验它们的连接。由于 MD5 校验和是二进制数据的十六进制表示,因此请确保使用对二进制串联进行解码的 MD5,而不是 ASCII 或 UTF-8 编码的串联。完成后,添加连字符和部件号以获取 ETag。

这是从控制台在 Mac OS X 上执行此操作的命令:
  1. $ dd bs=1m count=5 skip=0 if=someFile | md5 >>checksums.txt
  2. 5+0 records in
  3. 5+0 records out
  4. 5242880 bytes transferred in 0.019611 secs (267345449 bytes/sec)
  5. $ dd bs=1m count=5 skip=5 if=someFile | md5 >>checksums.txt
  6. 5+0 records in
  7. 5+0 records out
  8. 5242880 bytes transferred in 0.019182 secs (273323380 bytes/sec)
  9. $ dd bs=1m count=5 skip=10 if=someFile | md5 >>checksums.txt
  10. 2+1 records in
  11. 2+1 records out
  12. 2599812 bytes transferred in 0.011112 secs (233964895 bytes/sec)
复制代码

此时,所有校验和都在 checksums.txt 中。要连接它们并解码十六进制并获取批次的 MD5 校验和,只需使用

$ xxd -r -p 校验和.txt | md5

现在添加“-3”;获取 ETag 因为有 3 个部分。

值得注意的是,Mac OS X 上的 md5 只写出校验和,但 Linux 上的 md5sum 也输出文件名。你需要摆脱它,但我确信有一些选项可以只输出校验和。您不必担心空格,因为 xxd 会忽略它。

注意:如果您通过 aws s3 cp 使用 aws cli 上传,那么您的块大小很可能为 8MB。根据文档,这是默认设置。






上一篇:ReactJS 组件文本区域在状态更改时不更新
下一篇:替换整个页面上多个单词的所有例子

使用道具 举报

Archiver|手机版|小黑屋|吾爱开源 |网站地图

Copyright 2011 - 2012 Lnqq.NET.All Rights Reserved( ICP备案粤ICP备14042591号-1粤ICP14042591号 )

关于本站 - 版权申明 - 侵删联系 - Ln Studio! - 广告联系

本站资源来自互联网,仅供用户测试使用,相关版权归原作者所有

快速回复 返回顶部 返回列表