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

So auf dem obigen Code erhalte ich folgende Ergebnisse:Zwei verschiedene MD5 am selben Eingang?

newFileName = e9f08a9c181551336e58119edd23109b.png (richtig)

newFileName2 = d41d8cd98f00b204e9800998ecf8427e.png (! Wrong)

Alle folgenden Ergebnisse würden auch wie die newFileName2 sein. Es spielt keine Rolle, was der korrekte newFileName ist, der newFileName2 wird immer den gleichen Wert wie oben gezeigt haben. Ich weiß wirklich nicht, in welchen Fällen dieses Problem?

+0

Vielleicht verbraucht 'getMd5Digest' den Stream –

+0

Beginnen Sie, um nachfolgende Aufrufe von' digestStream.getMd5Digest() 'zu vergleichen, erhalten Sie das gleiche Ergebnis? –

Antwort

3

Die Methode getMD5Digest ruft MessageDigest.digest auf.

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

Die Dokumentation für MessageDigest.digest sagen

Der Digest zurückgesetzt wird, nachdem dieser Aufruf erfolgt.

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

Als Ergebnis ist der erste Name ist der MD5 Digest des Eingangsstroms. Der zweite Name ist das MD5 eines neu gestarteten Digests, weshalb es immer gleich ist.

+0

Ok, ich habe es behoben, indem ich den Stream in ein Byte-Array eingelesen habe. Jedes Mal, wenn ich die Daten brauche, erstelle ich einen neuen Stream aus dem Array, also ist der Wert immer der richtige. Danke für den Tipp. – germanTHX

0

Meine Wette ist, dass MD5DigestCalculatingInputStream.getMd5Digest() den Stream konsumiert. Das bedeutet, dass der erste Aufruf den Digest konsumiert und nachfolgende Aufrufe einen leeren Digest zurückgeben, der dann immer das gleiche falsche Ergebnis liefert.

Verwandte Themen