2017-08-21 10 views
1

ファイルの内容が同じ場合、エンコードされたバージョンも同じであるようにファイルをエンコードする必要があります。Ruby - GzipWriterがヘッダにメタデータを追加しないようにします。

This is my secret setup file

私のコードは次のとおりです。:

私は、config.ymlをエンコードするために必要なファイルは、以下の文字列が含ま時

require 'stringio' 
require 'base64' 
require 'zlib' 

my_text = File.read('config.yml') 
wio = StringIO.new('W') 
w_gz = Zlib::GzipWriter.new(wio) 
w_gz.mtime = 0 # Specify the modification time (mtime) in the gzip header 
w_gz.orig_name = 'userdata' # Specify the original name (str) in the gzip header 
w_gz.write(my_text) 
w_gz.close 
puts Base64.encode64(wio.string) 

Base64は、エンコードされた文字列をレンダリングし、 config.ymlの内容が同じ場合、文字列はまったく同じでなければなりません。スクリプトの

最初の実行:

H4sIC ゴー Am1kAA3VzZXJkYXRhAAvJyCxWAKLcSoXi1OSi1BIgVVJaoJCWmZPK BQAdlUQpHQAAAAの==

しかし、いくつかのメタデータは、同じ Base64エンコードさの文字列、例を取得することができなくなりますが追加されているようです後で

秒:

H4sIC G4

分後 Am1kAA3VzZXJkYXRhAAvJyCxWAKLcSoXi1OSi1BIgVVJaoJCWmZPK BQAdlUQpHQAAAAの==:

H4sIC GKB m1kAA3VzZXJkYXRhAAvJyCxWAKLcSoXi1OSi1BIgVVJaoJCWmZPK BQAdlUQpHQAAAAの==

+0

GzipWriterはzlibライブラリを使用しているので、これは避けられないようです。コマンドラインを使用してgzipファイルを作成し、エンコーディングが同じかどうか確認してください。ファイルを圧縮するのは根本的に新しい操作なので、私の気持ちは決して同じではないということです。また、生成されたMD5ハッシュまたはSHA1ハッシュを比較して、それらが異なるかどうかを調べる必要があります。 –

+0

@ RudolfOlah文字列が異なる場合、ハッシュも異なるはずです。 – tadman

答えて

2

0mtimeがあるように思わ設定するというあなたの試み無視される。 1000000000または1の任意の値を使用しても、それはシフトしません。

これは、GzipライブラリがCベースであり、0が偽と判断され、割り当てられていないため、無効になっているためです。

Gzip RFCはかなり短く、多くのメタデータがそこにはありません。

+---+---+---+---+---+---+---+---+---+---+ 
|ID1|ID2|CM |FLG|  MTIME  |XFL|OS | (more-->) 
+---+---+---+---+---+---+---+---+---+---+ 
0

ただ、手動でゼロで圧縮された結果の8バイト(インデックス4..7)を介して第5回を交換してください。これはmtimeをゼロに設定し、RFCごとに時刻が設定されていないことを示します。あなたのためにこれを行うためにRubyのクラスを取得する方法はないようです。

関連する問題