显示垃圾的JavaMD5哈希

显示垃圾的JavaMD5哈希,java,encryption,md5,Java,Encryption,Md5,我编写了一个简单的函数来将字符串转换为md5,我在输出中看到了奇怪的字母。我想一些字符编码是乱七八糟的。我能指出我做错了什么吗 public class App { public static void main(String[] args){ String str = "helloWorldhelloWorldhelloWolrd"; getHash(str); } public static void getHash(String str){ try {

我编写了一个简单的函数来将字符串转换为md5,我在输出中看到了奇怪的字母。我想一些字符编码是乱七八糟的。我能指出我做错了什么吗

public class App 
{   
public static void main(String[] args){
    String str = "helloWorldhelloWorldhelloWolrd";
    getHash(str);

}

public static void getHash(String str){
    try {
        byte[]  three = str.getBytes("UTF-8");
        MessageDigest   md = MessageDigest.getInstance("MD5");
        byte[] thedigest = md.digest(three);
        String  str1 = new String(thedigest,"UTF-8");
        System.err.println(str1);
    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();
    }catch (UnsupportedEncodingException e) {

        e.printStackTrace();
    }
}
}

输出: 这就是我所看到的

                                n?)?????fC?7

您需要将字节转换为十六进制字符串,而不是直接转换为字符串:

byte[] thedigest = md.digest(three);
StringBuilder buff = new StringBuilder();
for (byte b : theDigest) {
  String conversion = Integer.toString(b & 0xFF,16);
  while (conversion.length() < 2) {
    conversion = "0" + conversion;
  }
  buff.append(conversion);
}
String str1 = buff.toString();
System.err.println(str1);
字节[]thedigest=md.digest(三个); StringBuilder buff=新的StringBuilder(); for(字节b:最大值){ 字符串转换=整数.toString(b&0xFF,16); while(conversion.length()<2){ 换算=“0”+换算; } buff.append(转换); } 字符串str1=buff.toString(); 系统错误打印项次(str1);
您不能将摘要显示为字符串(因为它只是垃圾),您需要以某种方式转换字节,以便以人类可读的形式显示它们。我建议使用Base64编码器


另一个线程正在讨论如何将MD5转换为字符串。

FWIW,如果您可以使用第三方库,可以使用
Hashing.MD5().hashString(String,Charsets.UTF_8).toString()
,在一行程序中获得十六进制编码的MD5哈希。这完全行不通。您必须担心负字节,这意味着您必须执行
b&0xFF
,然后您必须担心填充,因为有些字节将被编码为一个字符,没有前导零。这就是我使用的:
final biginger bigInt=new biginger(1,md.digest());格式(“%032x”,bigInt)@LouisWasserman负字节将采用两位补码格式否?通过您的更改,我看到此6e-6329-647f-7f-22-47-42-5210661143-3837Thx。杰森的评论也是如此。