【问题标题】:30 char md5 digest30 char md5 摘要
【发布时间】:2014-02-19 11:10:23
【问题描述】:

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

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

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

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

谢谢, 米通

【问题讨论】:

    标签: java md5 md5sum


    【解决方案1】:

    不要将摘要转换为数字!

    使用类似的东西:

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

    【讨论】:

    • 非常感谢您的帮助。似乎工作。有什么理由让我把它定为 30 字符长。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多