gpt4 book ai didi

java - 为什么S3 getObjectMetadata ETAG 额外填充0

转载 作者:太空宇宙 更新时间:2023-11-04 13:26:56 26 4
gpt4 key购买 nike

当我比较本地文件系统和 S3 上的相同文件时,我得到相同的 MD5 和,唯一的区别是 S3 在左侧填充了一个额外的“0”?

知道为什么会发生这种情况,但并不是所有文件都是这样,只是少数文件如此。

这是本地文件

贾比尔:> echo '7f4d91c02fd8709186bf682bc811e16' |wc
1 1 32

这是 s3 上的对象

贾比尔:> echo '07f4d91c02fd8709186bf682bc811e16' |wc 1 1 33

这是我用来获取 md5(远程)的代码

ObjectMetadata objectMetadata = s3Client.getObjectMetadata(bucketName, key);
String destMd5 = objectMetadata.getETag().toString();

(本地

)

public static String getFileMD5(InputStream is) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
int numOfBytesRead;

byte[] buffer = new byte[8192];
while ((numOfBytesRead = is.read(buffer)) > 0) {
md.update(buffer, 0, numOfBytesRead);
}
} catch (NoSuchAlgorithmException e) {
logStatic.error(e);
} catch (IOException e) {
logStatic.error(e);
}

byte[] digest = md.digest();

BigInteger bigInt = new BigInteger(1, digest);
String output = bigInt.toString(16);
return output;
}

最佳答案

MD5 是一种旨在生成 16 字节值的算法。在用于将摘要转换为字符串的逻辑中,您必须考虑某些第一个值为 0 的情况。

例如,想象一下从 md.digest() 获取的 byte[][0, 0, 0, ..., 1] 的情况。在这种情况下,您的转换将产生字符串 "1",而正确的 MD5 输出将为 "00000000000000000000000000000001"

关于java - 为什么S3 getObjectMetadata ETAG 额外填充0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32559049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com