我有此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
。压缩算法与当前时间有关吗?
答案 0 :(得分:2)
是的。压缩时间存储在标题中。您可以使用mtime
方法将时间设置为固定值,这将解决您的问题:
gz = Zlib::GzipWriter.new(output)
gz.mtime = 1
gz.write(data)
gz.close
请注意,the Ruby documentation表示将mtime
设置为零将禁用时间戳记。我试过了,它不起作用。我还查看了源代码,似乎缺少此功能。好像是个错误。因此,您必须将其设置为非0的值(但请参见下面的注释-它将在以后的版本中修复)。
另一种选择是在检查相似数据时仅跳过标题。标头长10个字节,因此只能检查数据:
data = compress_data(input).bytes[10..-1]
请注意,您无需在to_a
上致电bytes
。它已经是一个数组:
String.bytes-> an_array
返回str中的字节数组。这是str.each_byte.to_a的简写。