Bagaimana saya melakukan perbedaan biner pada dua file berukuran identik di Linux?

37

Saya memiliki dua file berukuran identik, dan saya perlu melakukan diff biner untuk memeriksa apakah mereka sama.

Saat ini saya runnnig diff file1.img file2.imgtetapi butuh waktu cukup lama untuk memproses file 4 GB saya. Apakah ini cara paling efisien untuk melakukan ini?

Jon Cage
sumber

Jawaban:

45

cmpdirancang untuk menemukan perbedaan dalam file biner. Anda juga dapat mencoba checksumming ( sum) dan membandingkan hash.

mpez0
sumber
21

Salah satu cara paling umum untuk menentukan apakah dua file identik (dengan asumsi ukurannya cocok) menggunakan program untuk membuat " hash " (intinya sidik jari) dari suatu file. Yang paling umum adalah md5sumdan sha1sum.

Sebagai contoh:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Jika Anda memiliki banyak file yang perlu Anda periksa, misalnya jika Anda mentransfer direktori penuh file dari satu sistem ke yang lain, Anda dapat mengarahkan output dari sistem asli ke file, maka md5sum/ sha1sumsecara otomatis dapat menggunakan file itu untuk memberi tahu Anda file mana yang berbeda:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
Adam Batkin
sumber
2
MD5 tidak selalu dapat diandalkan untuk ini: digg.com/security/…
Jon Cage
28
Sebenarnya, MD5 dapat diandalkan untuk pemeriksaan integritas dasar. Hanya saja tidak dianggap sekuat kriptografis seperti yang pernah kita pikirkan. Jika Anda khawatir tentang peretas, jangan gunakan MD5, tetapi jika Anda hanya ingin tahu apakah beberapa file yang disalin dari CD rusak, atau jika kompiler Anda memuntahkan file yang identik setiap kali, MD5 lebih dari cukup.
Adam Batkin
16

Menemukan solusi - alat cmp yang hadir dengan sebagian besar rasa Linux.

Jon Cage
sumber
3

Jika saya hanya ingin tahu apakah mereka sama, saya lebih suka menggunakan sha1sum jika tersedia, atau md5 sebagai cadangan.

Jika saya ingin tahu betapa berbedanya mereka, atau di mana mereka berbeda, satu hal yang berfungsi adalah untuk engkol mereka berdua melalui od ('octal dump', yang biasanya memiliki opsi hex) untuk membuat file sementara dan kemudian diff mereka.

JustJeff
sumber
2
Jika Anda ingin tahu apakah keduanya adalah file yang sama, saya tidak berpikir menggunakan sha1sum (atau md5sum dalam hal ini) bisa lebih efisien daripada sekadar diff (karena ini adalah pertanyaan awal), karena walaupun keduanya ( besar) file berbeda di awal), Anda akan membaca keduanya sepenuhnya sebelum tahu mereka berbeda.
Pierre
@Pierre TAPI, hashing dan penandatanganan crypto berfungsi di perangkat jarak jauh.
VasyaNovikov
1

Saya hanya menjalankan beberapa tolok ukur pada file 100+ MB. diff adalah yang tercepat, sementara cmp berada di urutan kedua, dan menggunakan md5sum berada di urutan terakhir.

# time diff file1 file2; echo $?

real    0m0.122s
user    0m0.009s
sys 0m0.113s
0
# time cmp file1 file2; echo $?

real    0m0.213s
user    0m0.097s
sys     0m0.117s
0
# time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m0.279s
user    0m0.211s
sys     0m0.066s

real    0m0.316s
user    0m0.225s
sys     0m0.073s
0

Saya mengulangi latihan dengan file 4,3 GB, dan harus menghapus dan membuat ulang file dengan dd karena cache RAM sangat mempengaruhi hasil.

$time diff file1 file2; echo $?

real    0m19.325s
user    0m0.995s
sys 0m5.280s
0

$time cmp file1 file2; echo $?

real    0m36.106s
user    0m4.399s
sys 0m6.147s
0

$time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m10.441s
user    0m8.054s
sys 0m2.357s

real    0m24.682s
user    0m8.027s
sys 0m3.442s
0

Berdasarkan hasil ini saya akan merekomendasikan memindahkan file ke mount RAMFS, dan tetap dengan diff.

terlarang
sumber
Saya suka Anda benar-benar melakukan patokan, tetapi 100 Mb tidak mewakili kasus OP. 1.000 MB akan jauh lebih baik.
jpaugh
1
setuju itulah sebabnya saya menjalankan tes pertunjukan 4,3 beberapa bulan kemudian. Sebenarnya butuh upaya untuk memotong cache OS.
forbidder
Saya membayangkan itu terjadi. Saya minta maaf karena tidak membaca membaca di tengah jawaban Anda. (Saya masih berpikir itu cukup bagus untuk diunggah, bahkan dengan hanya melihat benchmark pertama.) FWIW, ada beberapa keajaiban kernel untuk menonaktifkan penyimpanan file. Saya harus melakukan tolok ukur sendiri untuk melihat mana yang benar-benar berfungsi atau perlu.
jpaugh