2017-01-12 1 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()); 
} 

그래서 위의 코드에 난 다음 얻을 결과 :두 개의 다른 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 다이제스트이다. 두 번째 이름은 새로 재설정 된 다이제스트의 MD5이므로 항상 동일한 것입니다.

+0

좋아, 바이트 배열로 스트림을 읽음으로써 문제를 해결했습니다. 매번 내가 배열에서 새 스트림을 만드는 데이터가 필요하므로 값은 항상 올바른 것입니다. 힌트를 가져 주셔서 감사합니다. – germanTHX

0

내 생각에 MD5DigestCalculatingInputStream.getMd5Digest()가 스트림을 소비합니다. 즉, 첫 번째 호출이 다이제스트를 소비하고 이후 호출이 빈 다이제스트를 반환하면 항상 잘못된 결과가 생성됩니다.

관련 문제