576 Stimmen

Abrufen der MD5-Prüfsumme einer Datei in Java

Ich möchte Java verwenden, um die MD5-Prüfsumme einer Datei zu ermitteln. Ich war wirklich überrascht, aber ich habe nichts gefunden, das zeigt, wie man die MD5-Prüfsumme einer Datei abrufen kann.

Wie wird das gemacht?

11voto

Bill Punkte 12254

Hier ist eine praktische Variante, die Folgendes verwendet InputStream.transferTo() von Java 9, und OutputStream.nullOutputStream() von Java 11. Sie benötigt keine externen Bibliotheken und muss nicht die gesamte Datei in den Speicher laden.

public static String hashFile(String algorithm, File f) throws IOException, NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance(algorithm);

    try(BufferedInputStream in = new BufferedInputStream((new FileInputStream(f)));
        DigestOutputStream out = new DigestOutputStream(OutputStream.nullOutputStream(), md)) {
        in.transferTo(out);
    }

    String fx = "%0" + (md.getDigestLength()*2) + "x";
    return String.format(fx, new BigInteger(1, md.digest()));
}

y

hashFile("SHA-512", Path.of("src", "test", "resources", "some.txt").toFile());

gibt zurück.

"e30fa2784ba15be37833d569280e2163c6f106506dfb9b07dde67a24bfb90da65c661110cf2c5c6f71185754ee5ae3fd83a5465c92f72abd888b03187229da29"

10voto

user552999 Punkte 101

Wir haben einen Code verwendet, der dem obigen Code in einem früheren Beitrag ähnelt und

...
String signature = new BigInteger(1,md5.digest()).toString(16);
...

Achten Sie jedoch auf die Verwendung von BigInteger.toString() hier, da es führende Nullen abschneidet... (für ein Beispiel versuchen Sie s = "27" sollte die Prüfsumme "02e74f10e0327ad868d138f2b4fdd6f0" )

Ich schließe mich dem Vorschlag an, Apache Commons Codec zu verwenden, ich habe unseren eigenen Code damit ersetzt.

9voto

F.X Punkte 159
public static String MD5Hash(String toHash) throws RuntimeException {
   try{
       return String.format("%032x", // produces lower case 32 char wide hexa left-padded with 0
      new BigInteger(1, // handles large POSITIVE numbers 
           MessageDigest.getInstance("MD5").digest(toHash.getBytes())));
   }
   catch (NoSuchAlgorithmException e) {
      // do whatever seems relevant
   }
}

9voto

David Punkte 372

Sehr schnelle und saubere Java-Methode, die nicht auf externe Bibliotheken angewiesen ist:

(Ersetzen Sie MD5 einfach durch SHA-1, SHA-256, SHA-384 oder SHA-512, wenn Sie diese wünschen)

public String calcMD5() throws Exception{
        byte[] buffer = new byte[8192];
        MessageDigest md = MessageDigest.getInstance("MD5");

        DigestInputStream dis = new DigestInputStream(new FileInputStream(new File("Path to file")), md);
        try {
            while (dis.read(buffer) != -1);
        }finally{
            dis.close();
        }

        byte[] bytes = md.digest();

        // bytesToHex-method
        char[] hexChars = new char[bytes.length * 2];
        for ( int j = 0; j < bytes.length; j++ ) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }

        return new String(hexChars);
}

8voto

Ravikiran kalal Punkte 882
String checksum = DigestUtils.md5Hex(new FileInputStream(filePath));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X