我编写了以下函数来计算Java中的Md5校验和。
class Utils {
public static String md5Hash(String input) {
String result = "";
try {
System.out.println("Input=" + input);
final MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(input.getBytes());
result = md.digest().toString();
} catch (Exception ee) {
System.err.println("Error computing MD5 Hash");
}
return result;
}
};
多次调用Utils.md5Hash("abcde")
会产生不同的结果。我的理解是md5为字符串返回一个确定性和唯一的校验和。那是错的吗?另外请告诉我实施中的错误。感谢
答案 0 :(得分:7)
字节数组的toString()
方法不返回有意义的字符串。它返回数组对象的类型,后跟数组的hashCode。
如果要打印,请使用Hex或Base64编码将字节数组转换为String。 Apache commons-codec有方法可以做到这一点。
此外,请确保指定en编码,该编码支持将字符串转换为字节数组的任何类型的字符。您正在使用的方法使用平台默认编码,例如,如果它是latin-1并且您正在转换非latin-1字符,则可能会失败。 UTF-8是一个不错的选择。
答案 1 :(得分:0)
在Dinup Kandel给出的代码中,我不得不改变这个:
for (int i=0;i<messageDigest.length;i++) {
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}
进入
if ((0xff & messageDigest[i]) < 0x10) {
hexString.append("0"
+ Integer.toHexString((0xFF & messageDigest[i])));
} else {
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}
让我的单元测试工作。
注意:我用它来验证正确答案:
echo -n MyTestString | md5sum