2017-01-12 18 views
0
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()); 
} 

だから、上記のコードで、私は次のような結果を取得:2つの異なるMD5が同じ入力にありますか?

newFileName = e9f08a9c181551336e58119edd23109b.png(正)

newFileName2 = d41d8cd98f00b204e9800998ecf8427e.png(!間違った)

すべて次の結果もnewFileName2のようになります。正しいnewFileNameが何であるかは関係ありません。newFileName2は常に上に示したものと同じ値になります。私は本当にこの問題がどのような場合にわからないのですか?

+0

'getMd5Digest'がストリームを消費している可能性があります –

+0

' digestStream.getMd5Digest() 'の後続の呼び出しを比較し始めますが、同じ結果が得られますか? –

答えて

3

getMD5DigestメソッドはMessageDigest.digestを呼び出します。 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

ドキュメントは、この呼び出しが行われた後にダイジェストがリセットされ

言います。結果

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

最初の名前は、入力ストリームのMD5ダイジェストです。 2番目の名前は、新たにリセットされたダイジェストのMD5です。これが常に同じ理由です。

+0

私はストリームをバイト配列に読み込んで固定しました。たびに、私は配列から新しいストリームを作成するデータが必要なので、値は常に正しいものです。ヒントをありがとう。 – germanTHX

0

私はMD5DigestCalculatingInputStream.getMd5Digest()がストリームを消費すると考えています。つまり、最初の呼び出しでダイジェストが消費され、その後の呼び出しで空のダイジェストが返されると、常に同じ誤った結果が生成されます。

関連する問題