30 char md5消化

时间:2014-02-19 11:10:23

标签: java md5 md5sum

我使用以下代码为数据库中的 blob数据生成 md5

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

对于不同的字节数组,我获得的校验和在长度(30-32)方面有所不同。 对于31个字符长度校验和,我所理解的可能是删除前导零的效果。 (我通过添加前导零来处理它)

任何人都可以告诉我为什么在某些情况下我得到30个字符哈希?

谢谢, 大额牛

2 个答案:

答案 0 :(得分:0)

请勿将摘要转换为数字!

使用类似:

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

有许多不同的方法可以将byte []转换为HexStrings:

public class HexConverter {

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

    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 Commons Codec中删除DigestUtils)

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;
}

答案 1 :(得分:0)

高n位有可能为零。当你将byte []转换为数字时。如果n = 4,那么你可能会丢失一个&#39; 0&#39; 0一开始就是char。 如果n = 8,那么你将失去&#39; 00&#39;在你的md5十六进制代码的开头。