2011-09-26 33 views
3

MessageDigest中的digest()方法是否应始终为相同的输入提供相同的散列值?MessageDigest摘要()方法

我尝试这样做,我得到不同的一组hashvalues的对于相同的输入每次

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())); 

更新:改变参数去消化()方法

+0

实际上是否有签名'digest(String input)'的方法?因为[我看不到一个](http://download.oracle.com/javase/6/docs/api/java/security/MessageDigest.html)... – DaveRandom

回答

11

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

尝试

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

看到实际数据

编辑:关于从字符串创建MD5摘要的快速注释字符串数据 - 您应该始终使用相同的编码,显式,当散列时。例如:

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

还要注意,md5.digest需要一个字节数组作为输入,而不是字符串。 –

+0

@JeffFoster:我假设OP的真实代码实际上是有效的:)尽管如此,请更新我的示例,谢谢。 –