我有一个简单的方法,它接收一个字符串并使用 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
与所有其他的(在长度和内容上)有什么不同?
我在我的两个测试设备上都遇到了同样的行为,我必须至少创建 2 个BigInteger
才能获得正确长度的哈希:
- Nexus S (Android 4.1.1)
- 连结 7 (Android 4.2.2)