gpt4 book ai didi

java - 确定 GZIPOutputStream 行为

转载 作者:行者123 更新时间:2023-12-02 08:59:56 25 4
gpt4 key购买 nike

以下代码生成两个字符串的确定性文件(shasum 相同)。

    try(
FileOutputStream fos = new FileOutputStream(saveLocation);
GZIPOutputStream zip = new GZIPOutputStream(fos, GZIP_BUFFER_SIZE);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(zip, StandardCharsets.UTF_8));
){
writer.append(str);
}

产品:

a.gz f0200d53f7f9b35647b5dece0146d72cd1c17949

但是,如果我在命令行上获取该文件并重新压缩它,它会产生不同的结果

> gunzip -n a.gz ;gzip -n a ; shasum a.gz 

50f478a9ceb292a2d14f1460d7c584b7a856e4d9 a.gz

如何使用/usr/bin/gzip 和gunzip 使其与原始 sha 匹配?

最佳答案

我认为问题很可能是Gzip文件头。

  • Gzip 格式可以在文件头中包含文件名和文件时间戳。 (我发现您在解压缩和重新压缩时使用 -n ...这可能是正确的。)

  • Gzip 格式还在 header 中包含“操作系统 ID”。这应该识别源文件系统类型;例如0 表示 FAT,3 表示 UNIX,依此类推。

其中任何一个都可能导致 Gzip 文件存在差异,从而导致不同的哈希值。

如果我要自己解决这个问题,我会首先使用 cmp 来查看压缩文件差异从哪里开始,然后使用 od 来识别差异是什么。请参阅 Gzip 文件格式规范以了解差异的含义:

  • RFC 1952 - GZIP 文件格式规范版本 4.3
  • 维基百科的 gzip页。

How can I get it to match the original SHA using gzip and gunzip ?

假设差异在于操作系统 ID,我认为没有实用的方法可以使用 gzipgunzip 命令来解决此问题。

<小时/>

我查看了 Java 11 中 GZIPOutputStream 的源代码,它的前景并不乐观。

  • 它将时间戳硬连接为零。
  • 它将操作系统标识符硬连接为零(这应该意味着 FAT)。

硬接线采用私有(private)方法,几乎​​不可能通过子类化或反射来“修复”。您可以复制代码并以这种方式修复它,但是您必须无限期地维护您的变体 GZIPOutputStream 类。

(我会考虑更改应用程序......或者其他什么......这样我就不需要校验和相同。你还没有说明为什么要这样做。它仅用于测试目的,尝试寻找不同的方法来实现测试。)

关于java - 确定 GZIPOutputStream 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60242386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com