Làm cách nào để có được các tệp nén giống hệt nhau 100%, đối với các tệp nguồn chỉ khác nhau về ngày tạo?


8

Tôi muốn có thể nén tệp một cách dễ dàng và nếu tệp gốc giống hệt với tệp của người dùng khác, tôi muốn cả hai tệp nén của chúng tôi khớp với nhau, ngay cả khi ngày tệp gốc khác nhau .

Tôi muốn sử dụng tối đa 1GB RAM trong khi nén. Tôi đang nghiêng về một thuật toán bất đối xứng vì các tệp tôi có khá lớn và chúng mất ít nhất một giờ để nén với LZMA1 "ultra" trong 7-zip trên máy P4 có RAM 1GB và không có gì khác chạy. Tôi nghĩ 7-zip và FreeARC có thể được sử dụng cho mục đích của tôi. Tôi đã cố gắng tìm các lệnh tôi nên sử dụng, nhưng tôi không gặp nhiều may mắn.

chỉnh sửa : Nên tạo các tệp giống nhau 100%, ngay cả khi ngày tạo khác nhau. Điều này có thể được thực hiện thông qua --nodates trong Freearc, và với ???? trong 7-zip. Tôi đang tìm kiếm một lệnh tương đương cho 7-zip và cách để chuẩn hóa việc nén trên nhiều máy tính.


1
Làm thế nào chắc chắn là bạn rằng LZMA là xác định?
Ignacio Vazquez-Abrams

2
Mở rộng trên phần không có nhiều may mắn .
fideli

2
Câu hỏi ở đâu? Bất kỳ chương trình nén nào cũng sẽ không bị mất trừ khi nó đặc biệt được thực hiện để bị mất.
Dennis Williamson

Câu trả lời:


11

Tạo một vài tệp giống hệt nhau:

$ echo hello > file1.test
$ echo hello > file2.test

gzip chúng ...

$ gzip file1.test
$ gzip file2.test

quan sát trường dấu thời gian là sự khác biệt duy nhất:

$ hexdump file1.test.gz

0000000 8b1f 0808 TIME STMP 0300 6966 656c 2e31
0000010 6574 7473 cb00 cd48 c9c9 02e7 2000 3a30
0000020 0636 0000 0000                         

Để biết thêm thông tin về dấu thời gian, xem RFC

Bây giờ, bạn có thể lấy MD5 bắt đầu sau byte 8, 0 byte này trong các tệp của bạn và mất dấu thời gian của chúng hoặc trích xuất CRC16 từ các gzips đó (cũng xem RFC để biết thông tin về cách giải nén này)

Hoặc, bạn có thể lưu mà không có dấu thời gian:

$ echo test > file1.test
$ echo test > file2.test
$ gzip -n file1.test
$ gzip -n file2.test
$ md5sum file1.test.gz
cfe4ddf1c4c3891b4ff4a1269b42db82  file1.test.gz
$ md5sum file2.test.gz
cfe4ddf1c4c3891b4ff4a1269b42db82  file2.test.gz

1
Và, nếu không có cổng nào khác gzipcó sẵn cho Windows, thì Cygwin cung cấp nó.
Arjan

3

Không phải là một câu trả lời trực tiếp cho câu hỏi của bạn nhưng dù sao nó cũng có thể giúp ích.

Từ lâu (một thiên niên kỷ khác) tôi đã gặp vấn đề tương tự. Chúng tôi muốn biết nếu các tệp nén giống nhau mà không giải nén chúng và so sánh chúng.

Giải pháp của chúng tôi là lấy một md5sum của tệp trước khi nén nó, sau đó chúng tôi nén tệp và đổi tên thành md5sum.zip (.zip hoặc .tar.gz hoặc .rar hoặc .whthing) . Bằng cách đó, chúng tôi biết rằng nếu hai tệp có cùng tên (không có hậu tố) thì chúng giống hệt nhau.


2
Thật tuyệt, mặc dù tất nhiên chúng tôi biết nên đọc chúng tôi đã giả định ;-)
Arjan

Cũng tốt vì nó hoàn toàn độc lập với tốc độ nén: các tệp nén được tạo bởi các chương trình khác nhau hoặc sử dụng các cài đặt khác nhau vẫn có thể được công nhận là giống nhau.
Arjan

1
Bài viết này khá nhiều cố gắng để giải quyết vấn đề tương tự ... Medium.com/@mpreziuso/
XCore

2

pristine-tar có phiên bản gzip bị hack luôn tạo ra kết quả tương tự (và một phiên bản khác cho bzip2). Chọn một biến thể thuật toán và dấu thời gian và bạn tốt để đi.


1

Hack vào các nguồn của 7-zip. Nơi nó đọc ngày của tệp, chỉ cần chèn mã để thay đổi ngày thành 01.01.1997 hoặc bất cứ thứ gì khác - cố định cho tất cả các tệp. Biên dịch với tên khác nhau và sử dụng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.