2013-02-18 42 views
0

怪異的行爲我有一個簡單的方法,它在一個字符串,用MD5算法散列它(不用說,所有這些都是sysos監測/調試奇怪的行爲我已經經歷):MD5在Android

private String hashMD5(String input) throws UnsupportedEncodingException, NoSuchAlgorithmException { 
    MessageDigest digest = MessageDigest.getInstance("MD5"); 

    // BYTES_ENCODING == "UTF-8" 
    digest.update(input.getBytes(BYTES_ENCODING), 0, input.length()); 

    System.out.println(new BigInteger(1, digest.digest()).toString(16)); 
    System.out.println(new BigInteger(1, digest.digest()).toString(16)); 
    System.out.println(new BigInteger(1, digest.digest()).toString(16)); 

    String hash = new BigInteger(1, digest.digest()).toString(16); 
    System.out.println(hash + " : used hash"); 
    System.out.println(hash.length() + " - " + new BigInteger(1, digest.digest()).toString(16).length()); 
    return hash; 
} 

調用此方法時用一組字符串,這裏就是我得到:

02-18 08:49:23.355: I/System.out(2753): 78bfa0ce6d53a698a98aac899562bb4 
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e 
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e 
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e : used hash 
02-18 08:49:23.355: I/System.out(2753): 32 - 32 

所以,我給你所有的問題是:

爲什麼第一個BigInteger與其他所有的(長度和內容)有什麼不同?

我遇到兩個我的測試設備,在這裏我必須至少創建2 BigInteger得到正確長度的散列此相同的行爲:

  1. 的Nexus S(的Android 4.1.1)
  2. 的Nexus 7(安卓4.2.2)

回答

2

因爲第一digest.update()更新摘要,但不重置消息摘要instence。然後打印的第一個結果是input.getBytes(BYTES_ENCODING),0,input.length())與新的BigInteger(1,digest.digest())連接在一起的散列。toString(16)

評論(...)

請注意,BigInteger.toString()只會將字節數組轉換爲十六進制。它不附加任何前導零。

String s = new BigInteger(1, digest.digest()).toString(16); 
while (s.length()<16) s="0"+s; //or something else to the same effect 
System.out.println(s); 
+0

好了,你告訴我的是,目前只有第一次印刷得到我的哈希值,我的方法輸入的字符串和所有其他版畫的散列默認值爲消息摘要? – 2013-02-18 15:08:47

+0

另外,這將如何解釋,第一個值的長度不是標準MD5哈希的長度,我很困惑,說實話。 – 2013-02-18 15:11:59

+0

否參見[MessageDigest](http://docs.oracle.com/javase/1.4.2/docs/api/java/security/MessageDigest.html) 摘要(...)方法完成哈希計算,執行最終更新,重置摘要的狀態並返回結果。 更新(...)操作更新摘要,不返回任何值,也不重置摘要。 會發生什麼情況是,在第一次打印中,摘要是在不同的輸入上計算出來的(其中一部分通過更新,另一部分通過摘要),而其他打印則計算不同輸入的摘要。 – Javier 2013-02-18 15:14:13