minio etag是如何生成的

问题描述 投票:0回答:2

有谁知道当你PUT一个对象时,minio etag是如何生成的? 它是文件的哈希值吗?我们可以用它来防止同一文件上传两次吗?

非常感谢!

etag minio
2个回答
3
投票

etag 只是一个 md5 十六进制字符串。您可以像这样简单地测试它:

MinioClient client = new MinioClient("your endpoint","your accesskey","your secretkey");
ObjectStat objectStat = client.statObject("test", "XW02.jpg");
System.out.println(objectStat);

InputStream inputStream = client.getObject("test", "XW02.jpg");
String md5 = DigestUtils.md5DigestAsHex(inputStream);
System.out.println(md5);

0
投票

根据Minio维护者在相关github问题上的回答,ETag并不总是文件的MD5哈希值:

ETag有多种含义,很容易与md5sum混淆 -

https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html

这是您可能想要的解释@audouts

ETag 实体标签是对象的哈希值。 ETag 反映了变化 仅针对对象的内容,而不针对其元数据。 ETag 可以或 可能不是对象数据的 MD5 摘要。不管是不是 取决于对象的创建方式以及加密方式 描述如下:

  • 通过 PUT 对象、POST 对象或复制操作或通过 AWS 管理控制台创建的对象,并由 SSE-S3 或 明文,具有 ETag,它们是其对象数据的 MD5 摘要。

  • 通过 PUT 对象、POST 对象或复制操作或通过 AWS 管理控制台创建的对象,并通过 SSE-C 或 SSE-KMS,具有不是其对象数据的 MD5 摘要的 ETag。

  • 如果对象是通过分段上传或分段复制操作创建的,无论采用何种方式,ETag都不是MD5摘要。 加密。如果对象大于 16 MB,AWS 管理 控制台将上传或复制该对象作为分段上传,并且 因此 ETag 不会是 MD5 摘要。

这种令人困惑的实现是 AWS S3 的一个包袱,遗憾的是我们 必须携带:-)

因此,基于此和同一问题的

另一个答案,如果您的文件未加密,则 etag 为:

    如果文件大小
  • < 16 Mb: md5(file)
  • 如果文件大小 > 16 Mb:
    1. 将其分割成16Mb的部分。
    2. 计算每个部分的md5
    3. etag = md5sum(md5-part1.. md5-partN)-N,其中 N 是部件数
但是块大小并不严格。可由客户选择。例如,Minio Client (mc) 使用 16Mb,但 apache-libcloud 使用 5Mb。因此,它们具有不同的哈希值。

© www.soinside.com 2019 - 2024. All rights reserved.