【问题标题】:MessageDigest digest() methodMessageDigest digest() 方法
【发布时间】:2011-09-26 10:30:27
【问题描述】:

MessageDigest 中的 digest() 方法不应该总是为相同的输入提供相同的哈希值吗?

我试过了,每次都为相同的输入得到不同的哈希值集

md5 = MessageDigest.getInstance("MD5");
System.out.println(md5.digest("stringtodigest".getBytes()));
System.out.println(md5.digest("stringtodigest".getBytes())); 
System.out.println(md5.digest("stringtodigest".getBytes()));

更新:将参数更改为 digest() 方法

【问题讨论】:

  • 真的有签名digest(String input)的方法吗?因为I can't see one...

标签: java encryption md5


【解决方案1】:

您会看到调用 byte[].toString() 的结果 - 这并没有向您显示数据的实际哈希值。你基本上得到一个字符串,表明你在一个字节数组上调用了toString(这是[B部分),然后是Object.hashCode()返回的哈希值(这是@之后的十六进制值)。该哈希码没有考虑数组中的 data

试试

System.out.println(Arrays.toString(md5.digest(byteArrayToDigest)));

查看实际的数据

编辑:关于从 string 数据创建 MD5 摘要的快速说明 - 在散列时,您应该始终明确地使用相同的编码。例如:

byte[] hash = md5.digest(text.getBytes("UTF-8"));

【讨论】:

  • 还要注意 md5.digest 将字节数组作为输入,而不是字符串。
  • @JeffFoster:我假设 OP 的真实代码实际上是有效的 :) 不过会更新我的示例,谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2013-12-25
  • 2021-05-07
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多