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
得到正確長度的散列此相同的行爲:
- 的Nexus S(的Android 4.1.1)
- 的Nexus 7(安卓4.2.2)
好了,你告訴我的是,目前只有第一次印刷得到我的哈希值,我的方法輸入的字符串和所有其他版畫的散列默認值爲消息摘要? – 2013-02-18 15:08:47
另外,這將如何解釋,第一個值的長度不是標準MD5哈希的長度,我很困惑,說實話。 – 2013-02-18 15:11:59
否參見[MessageDigest](http://docs.oracle.com/javase/1.4.2/docs/api/java/security/MessageDigest.html) 摘要(...)方法完成哈希計算,執行最終更新,重置摘要的狀態並返回結果。 更新(...)操作更新摘要,不返回任何值,也不重置摘要。 會發生什麼情況是,在第一次打印中,摘要是在不同的輸入上計算出來的(其中一部分通過更新,另一部分通過摘要),而其他打印則計算不同輸入的摘要。 – Javier 2013-02-18 15:14:13