繁体   English   中英

Ruby Zlib 压缩为相同的输入提供不同的输出

[英]Ruby Zlib compression gives different outputs for the same input

我有这个用于压缩字符串的 ruby​​ 方法 -

    def compress_data(data)
        output = StringIO.new
        gz = Zlib::GzipWriter.new(output)
        gz.write(data)
        gz.close

        compressed_data = output.string
        compressed_data
    end

当我用相同的输入调用这个方法时,我在不同的时间得到不同的输出。 我正在尝试获取压缩输出的字节数组并比较它们。 当我运行下面的输出是Different的 -

input = "hello world"

output1 = (compress_data input).bytes.to_a
sleep 1
output2 = (compress_data input).bytes.to_a
if output1 == output2
    puts 'Same'
else
    puts 'Different'
end

当我删除睡眠时,输出Same 压缩算法和当前时间有关系吗?

选项 1 - 固定 mtime:

是的。 压缩时间存储在标题中。 您可以使用mtime方法将时间设置为固定值,这将解决您的问题:

gz = Zlib::GzipWriter.new(output)
gz.mtime = 1
gz.write(data)
gz.close

请注意, Ruby 文档说将mtime设置为零将禁用时间戳。 我试过了,它不起作用。 我还查看了源代码,似乎缺少此功能。 好像是个bug。 因此,您必须将其设置为 0 以外的其他值(但请参阅下面的评论 - 它将在未来版本中修复)。

选项 2 - 跳过标题:

另一种选择是在检查类似数据时跳过标题。 头是 10 字节长,所以只检查数据:

data = compress_data(input).bytes[10..-1]

请注意,您不需要在bytes上调用to_a 它已经是一个数组:

String.bytes -> an_array

返回 str 中的字节数组。 这是 str.each_byte.to_a 的简写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM