2012-10-25 56 views
0

我想在java中使用MessageDigest生成MD5哈希碼。請在下面找到示例代碼。我正在嘗試的字符串與一些代碼(KO00001)和系統日期相結合。Java MessageDigest提供31位而不是32位

String s = "KO00001"+"25/10/2012"; 
byte[] buffer = s.getBytes(); 
MessageDigest md5 = MessageDigest.getInstance("MD5"); 
md5.update(buffer); 
String str = new BigInteger(1,md5.digest()).toString(16).toUpperCase(); 
System.out.println(str+" length:"+str.length()); 

我得到的所有字符串像KO0000126/10/2012,KO0000126/10/2012的長度爲32。但對於字符串「KO0000125/10/2012」,結果長度爲31.

可能是什麼原因?

+0

這是什麼'BigInteger'計算? – 2012-10-25 09:10:46

回答

2

md5.digest() 16字節。

我懷疑你然後嘗試輸出它作爲一個32個字符的十六進制字符串。

爲此,您應該做類似的事情。

public static String toHexString(byte[] bytes) { 
    if (bytes == null) { 
     throw new IllegalArgumentException("byte array must not be null"); 
    } 
    StringBuffer hex = new StringBuffer(bytes.length * 2); 
    for (int i = 0; i < bytes.length; i++) { 
     hex.append(Character.forDigit((bytes[i] & 0XF0) >> 4, 16)); 
     hex.append(Character.forDigit((bytes[i] & 0X0F), 16)); 
    } 
    return hex.toString(); 
} 

,其結果是d41d8cd98f00b204e9800998ecf8427e

(編輯1:或Tichodroma建議:不要重新發明輪子,使用Apache共享編解碼器其實回答了很多這些問題是「檢查Apache的百科全書第一')

(編輯2:不使用的getBytes()沒有指定的編碼)

3

只是因爲數量的,你從哈希代碼的字節數組表示得到的,使用的BigInteger,它是小於別人一個位置離子。換句話說,該表示中的第一個(高)數字是零。 只是比較:

KO0000125/10/2012: 
10 radix: 14105476919805249323079848858308382190 length:38 
16 radix: A9C9DB4AA1D19A4126E63A7ECFD0DEE length:31 

KO0000124/10/2012: 
10 radix: 132805232305710448716177011414649345991 length:39 
16 radix: 63E95B7C6574B57A3FD202484D0D17C7 length:32 

KO0000126/10/2012: 
10 radix: 256722737628903394348650044729556126214 length:39 
16 radix: C123003325E6846E04656C2F3E7ECA06 length:32 
相關問題