这与上面的Andranik和Den Delimarsky的回答略有不同,但是它更加简洁,不需要任何按位逻辑。相反,它使用内置String.format
方法将字节转换为两个字符的十六进制字符串(不去除0)。通常,我只会评论他们的答案,但我没有这样做的声誉。
public static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
StringBuilder hexString = new StringBuilder();
for (byte digestByte : md.digest(input.getBytes()))
hexString.append(String.format("%02X", digestByte));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
如果您想返回一个小写的字符串,则只需更改%02X
为%02x
。
编辑:使用BigInteger就像wzbozon的答案一样,您可以使答案更加简洁:
public static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
BigInteger md5Data = new BigInteger(1, md.digest(input.getBytes()));
return String.Format("%032X", md5Data);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}