【问题标题】:why does S3 getObjectMetadata ETAG pads an extra 0为什么 S3 getObjectMetadata ETAG 填充一个额外的 0
【发布时间】:2015-09-14 07:12:11
【问题描述】:

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

知道为什么会发生这种情况,但并非所有文件都是这种情况,仅适用于少数文件。

这是本地文件

jabir: > echo '7f4d91c02fd8709186bf682bc811e16' |wc
1 1 32

这是 s3 上的对象

jabir : > 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;
    }

【问题讨论】:

    标签: java amazon-s3 md5


    【解决方案1】:

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

    例如,假设您从md.digest() 得到的byte[][0, 0, 0, ..., 1]。在这种情况下,您的转换将产生字符串 "1",而正确的 MD5 输出将是 "00000000000000000000000000000001"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2018-03-30
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多