增量哈希计算

时间:2015-04-16 17:25:01

标签: java hash

  MessageDigest md5 = MessageDigest.getInstance("md5");
  for (int i = 0; i < 10; i++) {
     String s = "" + i;
     byte[] bs = s.getBytes("UTF-8");
     md5.update(bs);

     String currMd5 = ...;
     System.out.println(currMd5);
  }

根据Javadocs:

  

public byte [] digest()   通过执行填充等最终操作来完成哈希计算。 完成此次通话后,摘要会重置。

因此无法使用。

在每次调用currMd5之后,是否有可能以某种方式产生update,即到目前为止基于所有输入递增?使用MD5不是约束,即任何合理的散列都应该有效。

1 个答案:

答案 0 :(得分:0)

好吧,一个解决方案似乎是克隆:

  MessageDigest md5 = MessageDigest.getInstance("md5");

  for (int i = 0; i < 10; i++) {
     String s = "" + i;
     byte[] bs = s.getBytes("UTF-8");
     md5.update(bs);

     MessageDigest md5c = (MessageDigest) md5.clone(); 

     byte[] bytes = md5c.digest();
     String currentMd5 = javax.xml.bind.DatatypeConverter.printHexBinary(bytes);
     System.out.println("md5: " + currentMd5);
  }

产生:

md5: CFCD208495D565EF66E7DFF9F98764DA
md5: 96A3BE3CF272E017046D1B2674A52BD3
md5: D2490F048DC3B77A457E3E450AB4EB38
md5: EB62F6B9306DB575C2D596B1279627A4
md5: 4100C4D44DA9177247E44A5FC1546778
md5: D6A9A933C8AAFC51E55AC0662B6E4D4A
md5: 124BD1296BEC0D9D93C7B52A71AD8D5B
md5: 2E9EC317E197819358FBC43AFCA7D837
md5: 22975D8A5ED1B91445F6C55AC121505B
md5: 781E5E245D69B566979B86E28D23F2C7

我希望有更好的解决方案,而不是那么喜欢克隆......