2014-02-19 76 views
0

我使用以下代碼生成md5 for blob data in database。30 char md5 digest

md5Checksum.update(byte[] --- read from database); 
String result = new BigInteger(1,md5Checksum.digest()).toString(16); 

校驗我得到長度(30-32)用於不同字節數組是變化的。 對於31字符長度的校驗和,據我所知可以是去除前導零的效果。 (我通過添加前導零來處理它)

任何人都可以告訴我爲什麼我在某些情況下得到30個字符的散列?

感謝, 大額牛

回答

0

不要轉換消化了一些!

使用類似:

byte[] b = md5Checksum.digest(); 
// now convert these bytes to chars 

有許多不同的方法,以字節[]轉換到HexStrings:

public class HexConverter { 

    // thanks to http://www.rgagnon.com/javadetails/java-0596.html 
    static private final String HEXES = "ABCDEF"; 

    public String toHex(byte[] raw) { 
     if (raw == null) { 
      return null; 
     } 
     final StringBuilder hex = new StringBuilder(2 * raw.length); 
     for (final byte b : raw) { 
      hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(HEXES.charAt((b & 0x0F))); 
     } 
     return hex.toString(); 
    } 
} 

Getting a File's MD5 Checksum in Java (此鏈接也顯示了從Apache如何瑟DigestUtils Commons Codec)

public static String getMD5Checksum(String filename) throws Exception { 
    byte[] b = createChecksum(filename); 
    String result = ""; 

    for (int i=0; i < b.length; i++) { 
     result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return result; 
} 
+0

非常感謝您的幫助。似乎工作。我有什麼理由把它當作30個字符長。 – kjkszpj

0

有一個高n位可能爲零的可能性。在將字節[]轉換爲數字時,如果n = 4,那麼在開始時可能會丟失一個'0'字符。 如果n = 8,那麼在md5十六進制代碼的開始處丟失'00'。