Android上的MD5奇怪行为

时间:2013-02-18 14:12:49

标签: java android 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;
}

使用set String调用此方法时,我得到的是:

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有任何不同(长度和内容)?

我在两个测试设备上都遇到了同样的行为,我必须创建至少2 {{1}}来获得正确长度的哈希:

  1. Nexus S(Android 4.1.1)
  2. Nexus 7(Android 4.2.2)

1 个答案:

答案 0 :(得分:2)

因为第一个digest.update()更新摘要但不重置MessageDigest instence。然后打印的第一个结果是input.getBytes(BYTES_ENCODING),0,input.length())与新BigInteger(1,digest.digest())连接的散列.toString(16)

注释读取digest.update(...)

的行

请注意,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);