java中的md5哈希中缺少零

时间:2013-06-21 13:48:12

标签: java md5

当我使用java加密md5中的某些内容时,它会删除哈希中的所有0,这对我来说不行,因为它不能用于php,因为php不会删除0。有没有办法解决它(除了使php删除0s)。这是我的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;
}

1 个答案:

答案 0 :(得分: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',格式化程序为您提供所需的两位数字。