两个不同的MD5在同一输入?

时间:2017-01-12 12:44:29

标签: java inputstream md5

select
    `getLatest`.`last_bug_id`
    , `mantis_bug_history_table`.`date_modified`
    , `mantis_bug_history_table`.`old_value`
    , `mantis_bug_history_table`.`new_value`
from 
    (
        select
              (
                select
                    `bug_id` 
                from
                    `mantis_bug_history_table` 
                where 
                    `date_modified` > unix_timestamp() - 14*24*3600 -- two weeks
                    and `field_name` like 'severity'
                    and `bug_id` = `prepared_bug_list`.`bug_id`
                order by 
                    `date_modified` desc
                limit 1
              ) as `last_bug_id`
        from
            `prepared_bug_list` 
    ) as `getLatest`
    inner join `mantis_bug_history_table`
            on `prepared_bug_list`.`bug_id` = `getLatest`.`last_bug_id`     
order by `getLatest`.`bug_id` ASC

所以在上面的代码中我得到以下结果:

try (InputStream is = item.getInputStream()) { final MD5DigestCalculatingInputStream digestStream = new MD5DigestCalculatingInputStream(is); final byte[] bytes = IOUtils.toByteArray(digestStream); final String newFileName = Hex.encodeHexString(digestStream.getMd5Digest()) + "." + FilenameUtils.getExtension(item.getName()); final String newFileName2 = Hex.encodeHexString(digestStream.getMd5Digest()) + "." + FilenameUtils.getExtension(item.getName()); } (正确)

newFileName = e9f08a9c181551336e58119edd23109b.png(错误!)

以下所有结果也类似于newFileName2。无论正确的newFileName是什么,newFileName2将始终与上面显示的值相同。我真的不知道这个问题是什么情况?

2 个答案:

答案 0 :(得分:3)

getMD5Digest方法调用MessageDigest.digest。

(源) https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/internal/MD5DigestCalculatingInputStream.java

MessageDigest.digest的文档说

  

完成此调用后,摘要将重置。

https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html#digest()

因此,第一个名称是输入流的MD5摘要。第二个名称是新重置摘要的MD5,这就是它始终相同的原因。

答案 1 :(得分:0)

我敢打赌,MD5DigestCalculatingInputStream.getMd5Digest()会使用该流。这意味着第一个调用会消耗摘要,后续调用会返回一个空摘要,然后会产生相同的错误结果。