Dengan asumsi bahwa disk I / O dan RAM bebas adalah hambatan (sementara waktu CPU bukan batasan), apakah ada alat yang dapat menghitung beberapa pesan sekaligus?
Saya khususnya tertarik menghitung MD-5 dan SHA-256 yang mencerna file besar (ukuran dalam gigabyte), lebih disukai secara paralel. Saya sudah mencoba openssl dgst -sha256 -md5
, tetapi hanya menghitung hash menggunakan satu algoritma.
Kode semu untuk perilaku yang diharapkan:
for each block:
for each algorithm:
hash_state[algorithm].update(block)
for each algorithm:
print algorithm, hash_state[algorithm].final_hash()
shell-script
hashsum
parallelism
Lekensteyn
sumber
sumber
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done
for i in file1 file2 …; do tee < "$i" >(sha256sum) | md5sum ; done
Kemudian Anda harus menambahkan kode tambahan untuk menandai nama file, karena itu dikirim sebagai input standar kemd5sum
dansha256sum
.Jawaban:
Lihat
pee
("tee standard input to pipes
") darimoreutils
. Ini pada dasarnya setara dengantee
perintah Marco , tetapi sedikit lebih mudah untuk diketik.sumber
pee
memiliki antarmuka terbaik, perbandingan waktu dengan alat lain dapat ditemukan di posting ini yang juga menunjukkan alat Python multi-threaded.moreutils
konflik denganGNU parallel
sistem Debian saya ... meskipun, ada baiknya mengetahui ada alat seperti itu.aptitude
Jangan biarkan saya memiliki kedua paket pada saat yang sama).moreutils-parallel
nama untuk menghindari konflik.Anda dapat menggunakan
for
loop untuk loop di atas file individual dan kemudian menggunakantee
dikombinasikan dengan substitusi proses (bekerja di antara Bash dan Zsh antara lain) untuk pipa ke checksummers yang berbeda.Contoh:
Anda juga dapat menggunakan lebih dari dua checksummers:
Ini memiliki kelemahan bahwa checksummers tidak tahu nama file, karena dilewatkan sebagai input standar. Jika itu tidak dapat diterima, Anda harus memancarkan nama file secara manual. Contoh lengkap:
sumber
*sum
kumpulan alat, ekspresi sed ini dapat digunakan sebagai gantinya:sed "s;-\$;${file//;/\\;};
(mengganti trailing-
dengan nama file, tetapi memastikan bahwa nama file akan lolos dengan benar).zsh
. Di ksh93 dan bash, output dari sha256sum pergi ke md5sum. Anda akan ingin:{ tee < "$file" >(sha256sum >&3) | md5sum; } 3>&1
. Lihat unix.stackexchange.com/q/153896/22565 untuk masalah sebaliknya.Sangat disayangkan bahwa utilitas openssl tidak menerima banyak perintah digest; Saya kira melakukan perintah yang sama pada banyak file adalah pola penggunaan yang lebih umum. FWIW, versi utilitas openssl pada sistem saya (Mepis 11) hanya memiliki perintah untuk sha dan sha1, bukan salah satu dari varian sha lainnya. Tapi saya punya program yang disebut sha256sum, serta md5sum.
Berikut adalah program Python sederhana, dual_hash.py, yang melakukan apa yang Anda inginkan. Ukuran blok 64k tampaknya optimal untuk mesin saya (Intel Pentium 4 2.00GHz dengan 2G RAM), YMMV. Untuk file kecil, kecepatannya kira-kira sama dengan menjalankan md5sum dan sha256sum secara berurutan. Tetapi untuk file yang lebih besar, ini jauh lebih cepat. Misalnya, pada file byte 1967063040 (gambar disk kartu SD yang penuh dengan file mp3), md5sum + sha256sum memakan waktu sekitar 1m44.9s, dual_hash.py membutuhkan waktu 1m0.312s.
dual_hash.py
Saya kira C / C ++ versi program ini akan menjadi sedikit lebih cepat, tapi tidak banyak, karena sebagian besar pekerjaan yang dilakukan oleh modul hashlib, yang adalah ditulis dalam C (atau C ++). Dan seperti yang Anda sebutkan di atas, hambatan untuk file besar adalah kecepatan IO.
sumber
md5sum
dansha256sum
digabungkan (4.7s + 14.2s vs 18.7s untuk skrip Python ini, file dalam cache; 33.6s untuk cold run). 64KiB vs 1MiB tidak mengubah situasi. Dengan kode yang dikomentari, 5.1d dihabiskan untuk md5 (n = 3), 14.6d pada sha1 (n = 3). Diuji pada i5-460M dengan 8GB RAM. Saya kira ini bisa lebih ditingkatkan dengan menggunakan lebih banyak utas.digests
hanya memproses satu file pada setiap panggilan. Jadi, bahkan jika Anda menyebutnya dalam satu lingkaran itu akan membuat konteks md5 & sha baru pada setiap panggilan. FWIW, Anda dapat menikmati hash SHA-256 yang dapat dilanjutkan .Anda selalu bisa menggunakan sesuatu seperti GNU parallel :
Atau, jalankan saja salah satu dari keduanya di latar belakang:
Atau, simpan output ke file yang berbeda dan jalankan beberapa pekerjaan di latar belakang:
Itu akan meluncurkan banyak
md5sum
dansha256sum
contoh saat Anda memiliki file dan mereka semua akan berjalan secara paralel, menyimpan output mereka ke nama file yang sesuai. Hati-hati, ini bisa menjadi berat jika Anda memiliki banyak file.sumber
Karena penasaran apakah skrip Python multi-ulir akan mengurangi waktu berjalan, saya membuat
digest.py
skrip ini yang menggunakanthreading.Thread
,threading.Queue
danhashlib
untuk menghitung hash untuk beberapa file.Implementasi Python multi-threaded memang sedikit lebih cepat daripada menggunakan
pee
dengan coreutils. Sebaliknya Java adalah ... meh. Hasilnya tersedia dalam pesan komit ini :Output hash kompatibel dengan output yang dihasilkan oleh coreutils. Karena panjangnya tergantung pada algoritma hashing, alat ini tidak mencetaknya. Penggunaan (untuk perbandingan,
pee
juga ditambahkan):sumber
pee "openssl sha256" "openssl md5" < file
, tetapi, jujur, saya hanya mencobanya, dan itu tidak mengalahkan digest.py. Itu mempersempit jeda.Jacksum adalah utilitas bebas platform independen untuk menghitung dan memverifikasi checksum, CRC, dan hash (pesan intisari) serta cap waktu file. (disarikan dari halaman manual jacksum )
Ini adalah file yang besar, dapat memproses file hingga 8 Exabytes (= 8.000.000.000 Gigabytes), mengandaikan sistem operasi Anda masing-masing. Sistem file Anda juga file yang besar. (disarikan dari http://www.jonelo.de/java/jacksum/ )
Contoh penggunaan:
Output sampel:
Di ubuntu, jalankan perintah
apt-get install jacksum
untuk mendapatkannya.Atau, kode sumber tersedia di
sumber