我想将我的20-jar应用程序分发为pack200文件,但为了验证,我还需要提供文件校验和。
因为我是偏执狂(谢谢你,JWS),我想对解压缩文件也有校验和。
pack200的解压缩是否确定并在所有平台上都给出相同的结果(Win / Mac / Linux交叉32/64位)?
换句话说,我可以解压缩一台计算机上的文件,计算它们的校验和,并期望它们在其他计算机上解压缩时始终相同吗?
编辑:感谢您的评论。我正在寻找一些硬性规范来确认或否认这一点。
做出假设(即使是基于几台机器上的测试)也意味着风险。
实现可能因平台和Java版本而异。即使是相同的实现也可以给出不同的结果(考虑ZIP目录中项目的顺序?)。这就是为什么我问所有平台和Java版本是否相同 AND 确定性。
如果无法确认或拒绝,那么这个后续问题怎么样?如何在解压缩后验证jar是否有效?考虑到半成品文件,伽马射线会破坏文件中的单个位以及诸如此类的东西。
答案 0 :(得分:7)
想想that's你在寻找什么。
...但是,对于任何给定的Pack200存档,每个解压缩器都需要为传输的每个类文件生成特定的逐字节图像。该要求被放置在解压缩器上,以使压缩器能够传输信息,例如消息摘要,其与传输的类文件的最终字节方式内容有关。本节描述了对每个解压缩器的限制,这些限制使得其输出文件的字节方式内容成为其输入的明确定义的函数。
这意味着你可以在这里做你想做的事。 JNF / Pack200通过取出跨类共享的常量并智能地压缩.class文件来工作 - 但标准的这一部分说虽然可以通过多种方式重建类文件,但这将导致无法验证这些带有摘要的文件。为了避免这个问题,Pack200明确指定解码应该如何工作 - 因此当输出.class文件可能与输入.class文件不同时,每个Pack200解压缩器的输出.class文件将匹配每个其他Pack200解压缩器的输出.class文件。 / p>
所以你最好的选择是用Pack200打包它们,解压缩它们,然后做MD5或类似的摘要算法,并用它来验证解压缩的文件。
希望能回答你的问题!
答案 1 :(得分:1)
我正在寻找一些硬性规范来确认或否认这一点。
@Travis的回答说重建的类文件与原始类文件不是逐字节的,这(显然)意味着JAR文件也不相同。
此外,没有任何文档说unpack200
将在所有平台上生成相同的JAR文件,我不指望它。 (首先,不同的平台将运行不同版本的unpack200
...)
如果无法确认或拒绝,那么这个后续问题怎么样?如何在解压缩后验证jar是否有效?考虑到半成品文件,伽马射线会破坏文件中的单个位以及诸如此类的东西。
我认为没有办法做到这一点。如果我们假设重新生成的JAR文件可能与平台有关,那么我们就没有基线来生成校验和。
我认为您最好的选择是发送pack200文件的高质量校验和,并相信unpack200将正常工作或在失败时设置非零退出代码...就像任何正确编写的实用程序一样做。
顺便说一句,如果您担心随机错误,当JVM从JAR文件加载代码时,您将如何检测“宇宙射线”效应?明智的做法是使用ECC内存等,并将其留给硬件处理。