压缩后的输出不同于Go to Ruby的实现

时间:2018-10-11 19:03:52

标签: ruby go zlib

我正在实现一个程序,将文件分解为git blob并适当地存储它。

我有一个基于ruby reference implementationan article from the git book

我正在尝试在here

中实施

但是,我遇到了一个问题,即每个实现中存储的压缩数据略有不同。

vbindiff显示前2个字节是相同的(从this test script开始)(如果我正在阅读此权利)。这些字节分别存储压缩方法,标志和标志(按照https://tools.ietf.org/html/rfc1950)。第三个字节是差异开始的地方,这可以是字典ID或原始输入数据的开始。数据将保持相似,直到接近文件末尾。我假设这可能是ADLER32校验和的差异。

zlib的go和Ruby实现似乎都不默认将字典传递给zlib(根据go zlib sourceruby zlib source

数据显示相同。

我不确定库中是否存在实现错误,或者我只是缺少什么。

为什么这些输出不同?

1 个答案:

答案 0 :(得分:4)

RFC 1951中定义的deflate算法(以RFC 1950定义的zlib格式以及RFC 1952定义的gzip格式使用)允许实现中的变化,这些变化可能导致压缩时产生不同的结果。但是这些结果仍将解压缩为相同的值。这样可以权衡压缩时间到压缩级别,并使zopfli之类的程序也可以实现比原始zlib库更好的压缩(以大大增加压缩时间为代价)。

Go使用自己编写的Go语言编写的deflate算法,而ruby使用zlib library。这就是您的示例在同一输入上创建不同的压缩输出的原因。但是,如果您从Go或Ruby程序中获取输出并进行解压缩(无论是使用Ruby还是Go还是任何符合标准的实现),它将再次得到完全相同的值。