有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Android上的java MD5怪异行为

我有一个简单的方法,它接收一个字符串,并用MD5算法对其进行散列(不用说,所有这些sysos都是为了监视/调试我所经历的奇怪行为):

private String hashMD5(String input) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("MD5");

    // BYTES_ENCODING == "UTF-8"
    digest.update(input.getBytes(BYTES_ENCODING), 0, input.length());

    System.out.println(new BigInteger(1, digest.digest()).toString(16));
    System.out.println(new BigInteger(1, digest.digest()).toString(16));
    System.out.println(new BigInteger(1, digest.digest()).toString(16));

    String hash = new BigInteger(1, digest.digest()).toString(16);
    System.out.println(hash + " : used hash");
    System.out.println(hash.length() + " - " + new BigInteger(1, digest.digest()).toString(16).length());
    return hash;
}

使用设置的字符串调用此方法时,我得到以下结果:

02-18 08:49:23.355: I/System.out(2753): 78bfa0ce6d53a698a98aac899562bb4
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e : used hash
02-18 08:49:23.355: I/System.out(2753): 32 - 32

所以我想问大家:

为什么第一个BigInteger在长度和内容上与所有其他的BigInteger有任何不同

我在两台测试设备上都遇到了同样的情况,我必须创建至少2BigInteger才能获得正确长度的哈希:

  1. Nexus S(安卓4.1.1)
  2. Nexus 7(安卓4.2.2)

共 (1) 个答案

  1. # 1 楼答案

    因为《第一文摘》。update()更新摘要,但不重置MessageDigest指令。然后打印的第一个结果是输入的哈希。getBytes(字节编码),0,输入。长度())与新的BigInteger(1,digest.digest())连接。toString(16)

    注释“摘要”一行。更新(…)

    请注意,BigInteger。toString()只将字节数组转换为十六进制。它不附加任何前导零

    String s = new BigInteger(1, digest.digest()).toString(16);
    while (s.length()<16) s="0"+s; //or something else to the same effect
    System.out.println(s);