Java Android上的MD5怪异行为
我有一个简单的方法,它接收一个字符串并使用MD5算法对其进行散列(不用说,所有这些Java Android上的MD5怪异行为,java,android,md5,Java,Android,Md5,我有一个简单的方法,它接收一个字符串并使用MD5算法对其进行散列(不用说,所有这些sysos都是用于监视/调试我所经历的奇怪行为): 使用集合字符串调用此方法时,我得到以下结果: 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.
sysos
都是用于监视/调试我所经历的奇怪行为):
使用集合字符串调用此方法时,我得到以下结果:
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
所以我想问大家的问题是:
为什么第一个biginger
与所有其他的在长度和内容上会有任何不同
我在两台测试设备上都遇到了同样的情况,我必须创建至少2个biginger
,以获得正确长度的哈希:
Nexus S(安卓4.1.1)
Nexus7(安卓4.2.2)
因为第一个digest.update()会更新摘要,但不会重置MessageDigest指令。然后,打印的第一个结果是input.getBytes(BYTES_编码)、0、input.length()与新的biginger(1、digest.digest())连接的哈希值。toString(16)
注释读取digest.update(…)的行
请注意,biginger.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);
String s=new BigInteger(1,digest.digest()).toString(16);
而(s.length)好的,你是说,目前只有第一次打印得到我在方法中输入的字符串的散列值,而所有其他打印都在散列一个默认的MessageDigest值?而且,这怎么解释第一个值的长度不是标准MD5散列的长度呢?老实说,我很困惑。否。See摘要(…)方法完成哈希计算,执行最终更新,重置摘要状态并返回结果。更新(…)操作更新摘要,不返回任何值,也不重置摘要。发生的情况是,在第一次打印时,摘要是在不同的输入上计算的(一部分被传递到更新,另一部分被传递到摘要),而另一部分则计算不同输入的摘要。感谢额外的解释,我把它整理好了!
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);