Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android上的MD5怪异行为_Java_Android_Md5 - Fatal编程技术网

Java Android上的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.

我有一个简单的方法,它接收一个字符串并使用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.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);