【问题标题】:Zeros missing from md5 hash in javajava中的md5哈希中缺少零
【发布时间】:2013-06-21 13:48:12
【问题描述】:

当我使用 java 加密 md5 中的某些内容时,它会从哈希中删除所有 0,这对我来说不好,因为它不适用于 php,因为 php 不会删除 0。有什么办法可以修复它(除了让 php 也删除 0)。这是我的java代码:

public String getMd5Hash(String str) {
    try {
        byte[] array = MessageDigest.getInstance("MD5").digest(str.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
            sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        throw new IllegalStateException("Something went really wrong.");
    }
    return null;
}

【问题讨论】:

  • 你能举个例子说明这会产生不正确的输出吗?
  • 这只是一个填充问题(例如,前导零被删除)?如果是这样,就其包含的位数而言,MD5 哈希是否总是相同的长度?如果是这样,您不能在左侧用零填充结果以使其达到那个长度吗?

标签: java md5


【解决方案1】:

Integer.toHexString 不会将零添加到您隐式需要的长度。使用带有“%02x”格式字符串的 java.util.Formatter 类将十六进制数字转换为您想要的格式。

下面的代码演示了这个问题。

import java.util.Formatter;

public class TestHex {

    public static final void main(String[]  args) {
        StringBuilder sb = new StringBuilder();
        Formatter formatter = new Formatter(sb);
        byte[] testbytes = {-127, 4, 64, -4};

        for (int i=0; i<testbytes.length; i++) {
            byte b = testbytes[i];
            System.out.printf("%s\t%s\n", formatter.format("%02x", b), Integer.toHexString(b & 0xff));
            sb.setLength(0);
        }
    }
}

运行时,会产生:

81      81
04      4
40      40
fc      fc

请注意第二行,其中 Integer.toHexString 仅返回 '4' 并且格式化程序会为您提供所需的两位数。

【讨论】:

  • 这不是问题。 | 0x100 确保号码为 3 位数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2012-08-17
  • 2011-12-08
相关资源
最近更新 更多