0

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

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

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

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

谢谢,米通

4

2 回答 2

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

或从在 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;
}
于 2014-02-19T12:24:44.207 回答
0

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

于 2014-12-01T03:44:58.313 回答