Ruby Zlib压缩为相同的输入提供不同的输出 选项1-固定的mtime:选项2-跳过标题:

我有此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。压缩算法与当前时间有关吗?

lts0129 回答:Ruby Zlib压缩为相同的输入提供不同的输出 选项1-固定的mtime:选项2-跳过标题:

选项1-固定的mtime:

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

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

请注意,the Ruby documentation表示将mtime设置为零将禁用时间戳记。我试过了,它不起作用。我还查看了源代码,似乎缺少此功能。好像是个错误。因此,您必须将其设置为非0的值(但请参见下面的注释-它将在以后的版本中修复)。

选项2-跳过标题:

另一种选择是在检查相似数据时仅跳过标题。标头长10个字节,因此只能检查数据:

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

请注意,您无需在to_a上致电bytes。它已经是一个数组:

  

String.bytes-> an_array

     

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

本文链接:https://www.f2er.com/3029472.html

大家都在问