30 个字符 MD5 文摘



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

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

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

谁能告诉我为什么我在某些情况下会得到 30 个字符的哈希?

谢谢Mithun

不要将摘要转换为数字!

使用类似以下内容:

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

有许多不同的方法可以将 byte[] 转换为十六进制字符串:

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

或从 在 Java 中获取文件的 MD5 校验和(此链接还显示了如何从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;
}

高 n 位有可能为零。当您将 byte[] 转换为数字时。如果 n=4,那么您可能会在开始时丢失一个"0"字符。如果 n=8,那么在 md5 十六进制代码的开头丢失了"00"。

最新更新