2011-09-26 35 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的真實代碼實際上是有效的:)儘管如此,請更新我的示例,謝謝。 –