JAVA Md5返回非确定性结果

JAVA Md5返回非确定性结果,java,security,hash,md5,md5sum,Java,Security,Hash,Md5,Md5sum,我在Java中编写了以下函数来计算Md5校验和 class Utils { public static String md5Hash(String input) { String result = ""; try { System.out.println("Input=" + input); final MessageDigest md = MessageDigest.getInstance("MD5");

我在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.md5Hashabcde会得到不同的结果。我的理解是md5为字符串返回一个确定性和唯一的校验和。这不对吗?否则请让我知道我的实现中的错误。感谢

字节数组的toString方法不会返回有意义的字符串。它返回数组对象的类型,后跟数组的哈希代码

如果要打印,请使用十六进制或Base64编码将字节数组转换为字符串。ApacheCommons编解码器有这样做的方法

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

字节数组的toString方法不会返回有意义的字符串。它返回数组对象的类型,后跟数组的哈希代码

如果要打印,请使用十六进制或Base64编码将字节数组转换为字符串。ApacheCommons编解码器有这样做的方法


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

我使用以下方法完成:

 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;
    }

我已使用以下方法完成:

 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;
    }

在Dinup Kandel给出的代码中,我必须更改以下内容:

for (int i=0;i<messageDigest.length;i++) {
   hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}

在Dinup Kandel给出的代码中,我必须更改以下内容:

for (int i=0;i<messageDigest.length;i++) {
   hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}

复制品不是真正的复制品。我实现了这个函数,并希望得到一个错误的帮助。那个人要求从头开始实现。@从工作角度看,您不需要从头开始实现吗?在这种情况下,为什么不使用apache库公共摘要?类org.apache.commons.codec.digest.DigestUtils很好地实现了varios range md5*函数。我实现了这个函数,并希望得到一个错误的帮助。那个人要求从头开始实现。@从工作角度看,您不需要从头开始实现吗?在这种情况下,为什么不使用apache库公共摘要?类org.apache.commons.codec.digest.DigestUtils很好地实现了varios range md5*函数。另外,在调用input.getBytes时指定编码,或者在不同的系统上使用不同的默认编码时可以改变编码。+1您可以使用result=Arrays.toStringmd.digest;相反,这不是很紧凑,也没有广泛使用。@JonSkeet:我在您写评论时编辑了我的答案:-另外,在调用input.getBytes时指定编码,或者在不同的系统上使用不同的默认编码。+1您可以使用result=Arrays.toString.digest;相反,虽然这不是很紧凑,也没有被广泛使用。@JonSkeet:我在你写评论时编辑了我的答案:-