Bagaimana cara mendapatkan 100% file terkompresi identik, untuk file sumber yang hanya berbeda pada tanggal pembuatan?

8

Saya ingin dapat mengkompres file tanpa kehilangan, dan jika file asli identik dengan file pengguna lain, saya ingin kedua file terkompresi kami cocok, walaupun tanggal file aslinya berbeda .

Saya ingin menggunakan maksimum 1GB RAM saat mengompresi. Saya condong ke arah algoritma asimetris karena file yang saya miliki cukup besar, dan mereka membutuhkan setidaknya satu jam untuk kompres dengan LZMA1 "ultra" dalam 7-zip pada mesin P4 dengan RAM 1GB dan tidak ada lagi yang berjalan. Saya pikir 7-zip dan FreeARC dapat digunakan untuk keperluan saya. Saya sudah mencoba menemukan perintah yang seharusnya saya gunakan, tetapi saya tidak beruntung.

sunting : 100% file identik harus dihasilkan, walaupun tanggal pembuatannya berbeda. Ini harus dimungkinkan melalui --nodates di Freearc, dan dengan ???? dalam 7-zip. Saya mencari perintah yang setara untuk 7-zip, dan cara untuk membakukan kompresi di beberapa komputer.

Andy
sumber
1
Seberapa yakin Anda bahwa LZMA bersifat deterministik?
Ignacio Vazquez-Abrams
2
Perluas pada bagian yang tidak memiliki banyak keberuntungan .
fideli
2
Dimana pertanyaannya? Setiap program kompresi harus lossless kecuali jika dibuat khusus untuk lossy.
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

11

Buat beberapa file identik:

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

gzip mereka ...

$ gzip file1.test
$ gzip file2.test

amati bidang cap waktu sebagai satu-satunya perbedaan:

$ 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                         

Untuk info lebih lanjut tentang cap waktu, lihat RFC

Sekarang, Anda dapat mengambil MD5 yang dimulai setelah byte 8, nolkan empat byte ini dalam file Anda dan kehilangan cap waktu mereka, atau ekstrak CRC16 dari gzip tersebut (lihat juga RFC untuk info tentang cara mengekstrak ini)

Atau, Anda dapat menyimpan tanpa stempel waktu:

$ 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
Gareth Davidson
sumber
1
Dan, jika tidak ada port lain gzipyang tersedia untuk Windows, maka Cygwin menyediakannya.
Arjan
3

Bukan jawaban langsung untuk pertanyaan Anda tetapi mungkin bisa membantu.

Dahulu (milenium berbeda) saya punya masalah yang sama. Kami ingin tahu apakah file terkompresi di tempat yang sama tanpa mendekompresinya dan membandingkannya.

Solusi kami adalah mendapatkan md5sum file sebelum mengompresnya, kemudian kami mengompres file dan menamainya menjadi md5sum.zip (.zip atau .tar.gz atau .rar atau. Apa pun) . Dengan begitu kami tahu bahwa jika dua file memiliki nama yang sama (tanpa akhiran) mereka identik.

Nifle
sumber
2
Bagus, meskipun tentu saja kita tahu harus membaca kita anggap ;-)
Arjan
Juga bagus karena sama sekali tidak tergantung pada tingkat kompresi: file terkompresi yang dibuat oleh program yang berbeda atau menggunakan pengaturan yang berbeda mungkin masih diakui sama.
Arjan
1
Artikel ini cukup banyak mencoba menyelesaikan masalah yang sama ... medium.com/@mpreziuso/…
XCore
2

pristine-tar memiliki versi gzip yang diretas yang selalu menghasilkan hasil yang sama (dan yang lain untuk bzip2). Pilih varian algoritme dan cap waktu dan Anda siap melakukannya.

Tobu
sumber
1

Meretas ke sumber 7-zip. Di mana ia membaca tanggal file, cukup masukkan kode untuk mengubah tanggal ke 01.01.1997, atau yang lainnya - diperbaiki untuk semua file. Kompilasi dengan nama yang berbeda dan gunakan.

kagali-san
sumber