1

我编写了以下函数来计算 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 返回一个字符串的确定性和唯一性校验和。那是错的吗?否则请让我知道我的实现中的错误。谢谢

4

3 回答 3

7

字节数组的toString()方法不返回有意义的字符串。它返回数组对象的类型,后跟数组的 hashCode。

如果要打印,使用 Hex 或 Base64 编码将字节数组转换为字符串。Apache commons-codec 有方法可以做到这一点。

此外,请确保指定支持任何类型的字符的 en 编码,以将您的字符串转换为字节数组。您正在使用的方法使用平台默认编码,例如,如果它是 latin-1 并且您正在转换非 latin-1 字符,则该方法可能会失败。UTF-8 是一个不错的选择。

于 2012-09-17T10:27:53.963 回答
1

我已经使用以下方式完成了:

 public static String encryptedLoginPassword( String password ) 
    {
        String encryptedData="";
    try{
        MessageDigest algorithm = MessageDigest.getInstance("MD5");
        byte[] defaultBytes = password.getBytes();
        algorithm.reset();
        algorithm.update(defaultBytes);
        byte messageDigest[] = algorithm.digest();

        StringBuffer hexString = new StringBuffer();
        for (int i=0;i<messageDigest.length;i++) {
            hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
        }
        encryptedData=hexString.toString();
    }catch(NoSuchAlgorithmException nsae){

    }
    return encryptedData;
    }
于 2012-09-17T10:31:38.717 回答
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
于 2015-12-24T17:12:05.043 回答