【发布时间】:2014-03-17 13:09:50
【问题描述】:
我遇到了 Java md5 散列函数没有返回正确值的问题。对于大多数值,它确实返回了正确的值,但是我发现了一个输入不正确的示例。
我的代码是:
public String hash(String pass) throws Exception
{
encr = MessageDigest.getInstance("MD5");
return new BigInteger(1, encr.digest(pass.getBytes())).toString(16);
}
这会返回我尝试过的大多数示例的正确答案,例如 hash("beep") -> "1284e53a168a5ad955485a7c83b10de0"、hash("hello") -> "5d41402abc4b2a76b9719d911017c592" 等...
然后问题来了:hash("dog") -> "6d80eb0c50b49a509b49f2424e8c805" 而不是 "06d80eb0c50b49a509b49f2424e8c805",我从几个在线 md5 生成器以及 psql md5 生成器(我的 cod 正在与之交互)获得。
我非常感谢任何人都可以对此有所了解, 谢谢。
【问题讨论】:
-
对您的问题一无所知,但 google guava 也有哈希函数。 code.google.com/p/guava-libraries/wiki/HashingExplained
-
不知道谷歌番石榴,但一个哈希有一个 0 前缀,另一个没有。问题是使用
new BigInteger(..).toString(16)的十六进制编码,而不是哈希生成。 -
另外,您使用
.getBytes()。不要那样做:编码依赖于 JVM。请改用.getBytes("UTF-8")(如果您使用Java 7,请使用.getBytes(StandardCharsets.UTF_8))。