从Message Digest获取MD5字符串

Tom*_*Tom 31 java message md5 digest

我理解它是如何工作的但如果我想将MD5打印成String我该怎么做?

public static void getMD5(String fileName) throws Exception{
    InputStream input =  new FileInputStream(fileName);
    byte[] buffer = new byte[1024];

    MessageDigest hash = MessageDigest.getInstance("MD5");
    int read;
    do {
        read = input.read(buffer);
        if (read > 0) {
            hash.update(buffer, 0, read);
        }
    } while (read != -1);
    input.close();
}
Run Code Online (Sandbox Code Playgroud)

aru*_*aku 75

你可以减少写作:

String hex = (new HexBinaryAdapter()).marshal(md5.digest(YOUR_STRING.getBytes()))
Run Code Online (Sandbox Code Playgroud)

  • Java的来源是公开的.:)`HexBinaryAdapter.marshal()`只调用`DatatypeConverter.printHexBinary()`(你实际上可以使用它来代替,如果你想避免实例化`HexBinaryAdapter`),它会在第一次实例化一个单例`DatatypeConverterImpl`它被称为.在那之后,它只是直接调用`DatatypeConverterImpl`的'printHexBinary`.它使用的方法与WhiteFang34的答案非常相似. (14认同)
  • HexBinaryAdapter不在JDK9中 (3认同)

sta*_*ker 23

    String input = "168";
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] md5sum = md.digest(input.getBytes());
    String output = String.format("%032X", new BigInteger(1, md5sum));
Run Code Online (Sandbox Code Playgroud)

要么

DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("a".getBytes("UTF-8")))
Run Code Online (Sandbox Code Playgroud)

  • DatatypeConverter 不在 JDK9 中 (2认同)

ash*_*ram 21

试试这个

StringBuffer hexString = new StringBuffer();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest();

for (int i = 0; i < hash.length; i++) {
    if ((0xff & hash[i]) < 0x10) {
        hexString.append("0"
                + Integer.toHexString((0xFF & hash[i])));
    } else {
        hexString.append(Integer.toHexString(0xFF & hash[i]));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,现在可以使用StringBuilder而不是StringBuffer,在这个问题中讨论了各自的缺点和优点:http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer (2认同)

mmj*_*ers 21

您还可以使用Apache Commons Codec库.这个库包括方法public static String md5Hex(InputStream data)public static String md5Hex(byte[] data)DigestUtils类.不需要自己发明;)


Whi*_*g34 8

首先,您需要获得以下byte[]输出MessageDigest:

byte[] bytes = hash.digest();
Run Code Online (Sandbox Code Playgroud)

你不能轻易打印这个(例如new String(bytes)),因为它将包含不具有良好输出表示的二进制文件.您可以将其转换为十六进制,以便显示如下:

StringBuilder sb = new StringBuilder(2 * bytes.length);
for (byte b : bytes) {
    sb.append("0123456789ABCDEF".charAt((b & 0xF0) >> 4));
    sb.append("0123456789ABCDEF".charAt((b & 0x0F)));
}
String hex = sb.toString();
Run Code Online (Sandbox Code Playgroud)


小智 6

最短路径:

String toMD5(String input) {
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] raw = md.digest(input.getBytes());
    return DatatypeConverter.printHexBinary(raw);
}
Run Code Online (Sandbox Code Playgroud)

只记得处理异常。