web-dev-qa-db-ja.com

GZipはmacOSとLinuxで同じ圧縮結果を生成しません

個別にGZip圧縮された数千のファイルがあります(もちろん-nフラグを付けて、出力を決定的にします)。次に、Gitリポジトリーに移動します。これらのファイルのうち3つについて、GzipはmacOSとLinuxで同じ出力を生成しないことを発見しました。次に例を示します。

マックOS

$ cat Engine/Extras/ThirdPartyNotUE/NoRedist/EnsureIT/9.7.0/bin/finalizer | shasum -a 256
0ac378465b576991e1c7323008efcade253ce1ab08145899139f11733187e455  -

$ cat Engine/Extras/ThirdPartyNotUE/NoRedist/EnsureIT/9.7.0/bin/finalizer | gzip --fast -n | shasum -a 256
6e145c6239e64b7e28f61cbab49caacbe0dae846ce33d539bf5c7f2761053712  -

$ cat Engine/Extras/ThirdPartyNotUE/NoRedist/EnsureIT/9.7.0/bin/finalizer | gzip -n | shasum -a 256
3562fd9f1d18d52e500619b4a5d5dfa709f5da8601b9dd64088fb5da8de7b281  -

$ gzip --version
Apple gzip 272.250.1

Linux

$ cat Engine/Extras/ThirdPartyNotUE/NoRedist/EnsureIT/9.7.0/bin/finalizer | shasum -a 256
0ac378465b576991e1c7323008efcade253ce1ab08145899139f11733187e455  -

$ cat Engine/Extras/ThirdPartyNotUE/NoRedist/EnsureIT/9.7.0/bin/finalizer | gzip --fast -n | shasum -a 256
10ac8b80af8d734ad3688aa6c7d9b582ab62cf7eda6bc1a0f08d6159cad96ddc  -

$ cat Engine/Extras/ThirdPartyNotUE/NoRedist/EnsureIT/9.7.0/bin/finalizer | gzip -n | shasum -a 256
cbf249e3a35f62a4f3b13e2c91fe0161af5d96a58727d17cf7a62e0ac3806393  -

$ gzip --version
gzip 1.6
Copyright (C) 2007, 2010, 2011 Free Software Foundation, Inc.
Copyright (C) 1993 Jean-loup Gailly.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.

これはどのようにして可能ですか? GZipの実装は完全に標準だと思いましたか?

PDATE: macOSバージョンとLinuxバージョンがほとんどの場合同じ出力を生成することを確認するために、両方のOSが同じハッシュを出力します。

$ echo "Vive la France" | gzip --fast -n | shasum -a 256
af842c0cb2dbf94ae19f31c55e05fa0e403b249c8faead413ac2fa5e9b854768  -
31
Pol

GZipの圧縮アルゴリズム(Deflate)は厳密に全単射ではないことに注意してください。詳しく説明します。一部のデータについては、アルゴリズムの実装と使用されたパラメータに応じて、可能な圧縮出力が複数あります。したがって、Apple GZipとgzip 1.6が同じcompressed出力を返すことを保証するものではありません。これらの出力はすべて有効なGZipストリームです。標準では、これらの可能な出力は、同じ元のデータに対して解凍になります。

55
schnaader

フォーマットは非常に安定しているはずですが、 説明 を参照してください。オペレーティングシステムIDのフィールドが含まれています。明らかに、それはMacOSとLinuxとFreeBSDで異なります...

17
vonbrand

Gzip形式は標準であり、実装です-必ずしもそうではありません。ウィキペディアには少なくとも5つのfree/ossに依存しない実装がリストされており、独自の実装もあります。 Appleは明らかに異なるバージョン文字列を出力します。

フォーマットとアルゴリズムの両方により、多くの自由と、好みの問題である、および/またはさまざまなユースケースでより適切に機能する多くの設計の選択が可能になります。

参照 Zipファイル:履歴、説明、実装

私は通常、結果が異なる実装間で同じになるのは、小さな風のファイルのごく一部であると予想します。

10
fraxinus

圧縮前のファイルは同じですか?一部のVCS chekoutテキストファイルは、UTF8を使用するかどうかに関係なく、WindowsまたはLinuxの改行を使用して...

元のファイルに対してSHAコマンドを実行して、同じことを行っているかどうかを確認します。

圧縮レベル0を試して、正しく機能するかどうか確認してください。

両方のシステムでエンコードが異なる、ここに投稿できるいくつかの単純なファイルを見つけます。

ファイルは両方のシステムで正しく解凍されますか? SHAコマンドを再度実行します。

そして、常にあなた自身に尋ねてください:それは重要ですか? :)

0
Alfred P.