[英]MD5 Bizarre Behavior on Android
我有一個簡單的方法,它在一個字符串,用MD5算法散列它(不用說,所有這些sysos
是監控/調試我已經經歷了奇怪的行為):
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;
}
使用set String調用此方法時,這是我得到的:
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
與其他所有BigInteger
(長度和內容)有什么不同?
我在我的兩個測試設備上都遇到了同樣的行為,我必須創建至少2個BigInteger
以獲得正確長度的哈希值:
因為第一個digest.update()更新摘要但不重置MessageDigest instence。 然后打印的第一個結果是input.getBytes(BYTES_ENCODING),0,input.length())與新BigInteger(1,digest.digest())連接的散列.toString(16)
評論讀取digest.update(...)的行
請注意,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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.