问题
上传到 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 上执行此操作的命令:
- $ dd bs=1m count=5 skip=0 if=someFile | md5 >>checksums.txt
- 5+0 records in
- 5+0 records out
- 5242880 bytes transferred in 0.019611 secs (267345449 bytes/sec)
- $ dd bs=1m count=5 skip=5 if=someFile | md5 >>checksums.txt
- 5+0 records in
- 5+0 records out
- 5242880 bytes transferred in 0.019182 secs (273323380 bytes/sec)
- $ dd bs=1m count=5 skip=10 if=someFile | md5 >>checksums.txt
- 2+1 records in
- 2+1 records out
- 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。根据文档,这是默认设置。
|