当我比较本地文件系统和 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"
。
我是一名优秀的程序员,十分优秀!