【问题标题】:Jar differs but they should not罐子不同,但他们不应该
【发布时间】:2019-11-22 19:38:26
【问题描述】:

我有一种创建 jar 的方法。

public class Test {

    public static void main(String[] args) throws Exception {
        aha();
        aha();
        aha();
        aha();
        Thread.sleep(5000);
        aha();
    }

    private static void aha() throws IOException, NoSuchAlgorithmException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        JarOutputStream jos = new JarOutputStream(baos);
        jos.putNextEntry(new ZipEntry("sd"));
        jos.write("sdf".getBytes());
        jos.close();
        MessageDigest md = MessageDigest.getInstance("sha1");
        byte[] digest = md.digest(baos.toByteArray());
        for (byte b : digest) {
            System.out.print("," + b);
        }
        System.out.println();
    }
}

输出是:

,-57,-44,59,113,-126,-15,71,62,-90,-120,27,36,-3,69,26,-55,63,107,-93,102
,-57,-44,59,113,-126,-15,71,62,-90,-120,27,36,-3,69,26,-55,63,107,-93,102
,-57,-44,59,113,-126,-15,71,62,-90,-120,27,36,-3,69,26,-55,63,107,-93,102
,-57,-44,59,113,-126,-15,71,62,-90,-120,27,36,-3,69,26,-55,63,107,-93,102
,-124,-26,-79,-28,-34,77,-72,83,92,53,30,-13,95,21,-92,55,70,24,-72,39

我需要相同的摘要,但最后一个摘要不同。如何成为可重现的哈希?

【问题讨论】:

    标签: java jar sha1


    【解决方案1】:

    虽然几乎不可见,但如果您将ZipEntry 写入JarOutputStream,则底层ZipOutputStream 将为您初始化最后修改时间。

    if (e.xdostime == -1) {
        // by default, do NOT use extended timestamps in extra
        // data, for now.
        e.setTime(System.currentTimeMillis());
    }
    

    您必须手动初始化时间,setTime 才能获得恒定的结果。

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多