GZip은 macOS와 Linux에서 서로 다른 압축 결과를 생성합니다.

GZip은 macOS와 Linux에서 서로 다른 압축 결과를 생성합니다.

수천 개의 개별 GZip 압축 파일이 있습니다(물론 -n출력이 결정적이므로 플래그를 전달함). 그런 다음 Git 저장소로 이동합니다. 방금 파일 중 3개에 대해 Gzip이 macOS와 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
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

리눅스

$ 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 구현이 완전히 표준이라고 생각했나요?

고쳐 쓰다:대부분의 경우 macOS 및 Linux 버전이 동일한 출력을 생성하는지 확인하기 위해 두 운영 체제 모두 동일한 해시를 출력합니다.

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

답변1

GZip의 압축 알고리즘(Deflate)은 엄격하게 전단사적이지 않습니다. 자세한 설명: 일부 데이터의 경우 알고리즘 구현 및 사용된 매개변수에 따라 압축된 출력이 두 개 이상 있을 수 있습니다. 따라서 Apple GZip과 gzip 1.6이 동일한 결과를 반환한다는 보장은 없습니다.압축산출. 이러한 출력은 모두 유효한 GZip 스트림이며 표준은 이러한 가능한 각 출력이압축이 풀린동일한 원본 데이터에.

답변2

형식은 매우 안정적이어야 하지만 다음을 참조하세요.설명. 여기에는 운영 체제 ID 필드가 포함되어 있습니다. 분명히 이는 macOS, Linux 및 FreeBSD에서는 다를 수 있습니다.

답변3

Gzip 형식은 표준이지만 구현이 반드시 그런 것은 아닙니다. Wikipedia에는 ​​독점 구현뿐만 아니라 최소 5개의 free/oss 독립적 구현이 나열되어 있습니다. Apple은 분명히 다른 버전 문자열을 출력합니다.

형식과 알고리즘 모두 많은 자유와 다양한 디자인 선택을 허용하며, 이는 취향의 문제이거나 다양한 사용 사례에서 더 잘 작동합니다.

바라보다Zip 파일: 기록, 설명 및 구현

나는 일반적으로 작은 파일 세트에 대해서만 서로 다른 구현 간에 결과가 동일할 것으로 기대합니다.

답변4

압축 전 파일이 동일합니까? UTF8, Windows 또는 Linux 개행 사용 여부에 관계없이 일부 VCS 체크아웃 텍스트 파일은 다르게 표시됩니다.

원본 파일에서 SHA 명령을 실행하여 동일한 작업을 수행하는지 확인하세요.

압축 수준 0을 시도해보고 작동하는지 확인해 보세요.

두 시스템에서 다르게 인코딩된 간단한 파일을 여기에 게시할 수 있습니다.

두 시스템 모두에서 파일의 압축이 올바르게 풀립니까? SHA 명령을 다시 실행하십시오.

그리고 항상 스스로에게 물어보세요. 그게 중요한가요? :)

관련 정보