在http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml中,给出了如何计算String的MD5哈希的示例。这导致20位十六进制字符串。根据{{3}},我希望有一个32位的十六进制字符串。我得到了相同的结果,例如在http://en.wikipedia.org/wiki/MD5中使用dac2009响应。
为什么我会得到一些看起来像MD5哈希的东西但不是?我无法想象我得到的所有琴弦我必须用12个前导零填充。
编辑:一个代码示例
public static String MungPass(String pass) throws NoSuchAlgorithmException {
MessageDigest m = MessageDigest.getInstance("MD5");
byte[] data = pass.getBytes();
m.update(data,0,data.length);
BigInteger i = new BigInteger(1,m.digest());
return String.format("%1$032X", i);
}
答案 0 :(得分:44)
改为使用org.apache.commons.codec.digest.DigestUtils
:
DigestUtils.md5Hex(str);
这将给你32个字符串作为结果
答案 1 :(得分:3)
你一定错过了什么。链接的代码很好。确保问题与其他地方无关,与显示结果有关。可能性:
20
而不是0x20
,即32
。答案 2 :(得分:1)
我尝试了上面的例子,MungPass(“java”),我得到了一个32位的字符串, 93f725a07423fe1c889f448b33d21f46。因为你跑的时候你得到了第一个正确的20个,我猜你只是在打印输出中丢失了一些东西?
答案 3 :(得分:1)
您可以使用 DatatypeConverter.printHexBinary(digiest)获取由32个十六进制数字表示的128位哈希。以下是Java generate MD5 hash的完整代码段
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;
public class MD5HashGenerator
{
public static void main(String args[]) throws NoSuchAlgorithmException
{
String stringToHash = "MyJavaCode";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(stringToHash.getBytes());
byte[] digiest = messageDigest.digest();
String hashedOutput = DatatypeConverter.printHexBinary(digiest);
System.out.println(hashedOutput);
}
}