我使用以下代码为数据库中的 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"。