Java 这是什么样的哈希/加密? 私有字符串getString(字节[]字节) { StringBuffer sb=新的StringBuffer(); for(int i=0;i

Java 这是什么样的哈希/加密? 私有字符串getString(字节[]字节) { StringBuffer sb=新的StringBuffer(); for(int i=0;i,java,encryption,hash,Java,Encryption,Hash,如果我的文本=“测试” 第一部分toString()生成一个值“Encryption”$2@6966b26b" 然后第二部分得到它,并产生一个值“91431072057033211111520222781313839180246” 但是为什么md5是一个数字,而不是31f521a06d5060d1f38159c74a1f7cf2或类似的东西呢?我会说md5哈希,因为代码是MessageDigest.getInstance(“md5”):D函数“encrypt()”返回md5哈希。您应该将其重命名

如果我的文本=“测试” 第一部分toString()生成一个值“Encryption”$2@6966b26b" 然后第二部分得到它,并产生一个值“91431072057033211111520222781313839180246”
但是为什么md5是一个数字,而不是31f521a06d5060d1f38159c74a1f7cf2或类似的东西呢?

我会说md5哈希,因为代码是
MessageDigest.getInstance(“md5”)
:D

函数“encrypt()”返回md5哈希。您应该将其重命名为“哈希”,因为哈希!=加密。
如果你想加密一个字符串,你可以看这里:

代码中有明确的说明,你正在使用MD5哈希算法

现在你的问题是为什么:


但为什么md5是一个数字,而不是31f521a06d5060d1f38159c74a1f7cf2或类似的东西

答案很简单,看看从字节数组生成字符串的代码

private String getString(byte[] bytes)
   {
     StringBuffer sb = new StringBuffer();
   for (int i = 0; i < bytes.length; i++)
     {
       byte b = bytes[i];
       sb.append(0xFF & b);
     }
     return sb.toString();
   }

   public String encrypt(String source)
   {
     try
     {
       MessageDigest md = MessageDigest.getInstance("MD5");
       byte[] bytes = md.digest(source.getBytes());
       return getString(bytes);
     }
     catch (Exception e)
     {
       e.printStackTrace(); }
     return null;
   }
获取字节,即0x20,然后使用整数0x255执行逻辑“与”运算,然后将结果的十进制表示形式添加到StringBuilder中。 你想做的更像是

  byte b = bytes[i];
  sb.append(0xFF & b);

代码中的字面意思是MD5…数字表示是因为返回了大量字节。如果您希望它以十六进制表示,如31f521a06d5060d1f38159c74a1f7cf2,则需要将字节转换为16进制。所以是00-ff之间的值。但为什么md5是一个数字而不是31f521a06d5060d1f38159c74a1f7cf2或类似的东西?我发现了这个:但为什么md5是一个数字而不是31f521a06d5060d1f38159c74a1f7cf2或类似的东西?有没有办法将原始字符串转换为HexString?
sb.append(Integer.toHexString(0xff&b));