2014-02-19 45 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'。