14

http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml中给出了如何计算字符串的 MD5 哈希的示例。这会产生一个 20 位的十六进制字符串。根据http://en.wikipedia.org/wiki/MD5,我期望一个 32 位的十六进制字符串。例如,我在How can I generate an MD5 hash?中使用 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);
}

取自http://snippets.dzone.com/posts/show/3686

4

4 回答 4

47

改用org.apache.commons.codec.digest.DigestUtils

DigestUtils.md5Hex(str);

结果,这将为您提供 32 个字符的字符串

于 2011-10-15T06:32:43.653 回答
4

你一定错过了什么。链接代码很好。确保问题不在其他地方,与显示结果有关。可能性:

  • 在 GUI 中太小
  • 在具有多线程问题的控制台中
  • 通过即将被切断的网络包
  • 您将长度削减到20而不是0x20,即32
于 2011-10-15T08:16:20.343 回答
4

您可以使用DatatypeConverter.printHexBinary(digiest)获取由 32 个十六进制数字表示的 128 位哈希。下面是在 Java中生成 MD5 哈希的完整代码片段,

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);
}
}
于 2019-01-03T11:43:55.023 回答
1

我在上面尝试了您的示例,MungPass("java"),我得到了一个 32 位的字符串,93f725a07423fe1c889f448b33d21f46。既然你跑的时候第一个是正确的,我猜你只是在打印输出中遗漏了一些东西?

于 2013-01-22T17:04:09.240 回答