Warm tip: This article is reproduced from serverfault.com, please click

s3cmd-对于大于5GB的文件,如何计算Amazon-S3 Etag的算法是什么?

(s3cmd - What is the algorithm to compute the Amazon-S3 Etag for a file larger than 5GB?)

发布于 2012-08-29 21:47:00

上传到Amazon S3的小于5GB的文件具有一个ETag,该ETag只是该文件的MD5哈希,这使你很容易检查本地文件是否与你在S3上放置的文件相同。

但是,如果你的文件大于5GB,则Amazon对ETag的计算会有所不同。

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

我还怀疑新的ETag(破折号之前)仍然是MD5哈希,但是在分段上传的过程中包含了一些元数据。

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

Questioner
broc.seib
Viewed
0
Emerson Farrugia 2021-01-02 02:18:28

假设你将一个14MB的文件上传到没有服务器端加密的存储桶中,而部件大小为5MB。计算每个部分对应的3个MD5校验和,即前5MB,后5MB和后4MB的校验和。然后取其串联的校验和。MD5校验和通常以二进制数据的十六进制表示形式打印,因此请确保使用解码后的二进制级联的MD5,而不是ASCII或UTF-8编码级联的MD5。完成后,添加连字符和零件数量以获取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 checksums.txt | md5

现在有3个部分,请附加“ -3”以获取ETag。

笔记

  • 如果你通过aws-cli载,aws s3 cp则很可能具有8MB的块大小。根据docs,这是默认设置。
  • 如果存储桶已开启服务器端加密(SSE),则ETag不会是MD5校验和(请参阅API文档)。但是,如果你只是想验证上传的零件是否与你发送的零件匹配,则可以使用Content-MD5标题,S3会为你进行比较
  • md5在macOS上仅写出校验和,但md5sum在Linux / brew上也输出文件名。你将需要剥离它,但是我敢肯定有一些选项仅输出校验和。你无需担心空格,因为xxd它将忽略它。

代码链接