Bagaimana Cara Menghitung Hash file berukuran 1 Terabyte ke atas?

Jadi, saya memiliki beberapa file gambar cadangan sistem yang berukuran sekitar 1 terabyte, dan saya ingin menghitung dengan cepat hash masing-masing file tersebut (sebaiknya SHA-1).

Awalnya saya mencoba menghitung hash md5, 2 jam telah berlalu dan hash belum dihitung (sesuatu yang jelas untuk file besar hingga 1TB).

Jadi apakah ada program/implementasi di luar sana yang dapat meng-hash file 1TB dengan cepat?

Saya pernah mendengar tentang Tree-Hashing yang melakukan hashing pada sebagian file secara bersamaan, tetapi sejauh ini saya belum menemukan implementasi apa pun.


person Light Flow    schedule 28.03.2014    source sumber


Jawaban (3)


Jika Anda memiliki file berukuran 1 juta MB, dan sistem Anda dapat membaca file ini dengan kecepatan 100MB/s, maka

  • 1TB * 1000(TB/GB) = 1000 GB
  • 1000GB * 1000(MB/GB) = 1 juta MB
  • 1 juta MB/100(MB/s) = 10 ribu detik
  • 10000s/3600(s/hr) = 2.77... hr
  • Oleh karena itu, sistem 100MB/s memiliki waktu yang dibutuhkan 2,77... jam untuk membaca file terlebih dahulu, bahkan sebelum total waktu tambahan apa pun yang mungkin diperlukan untuk menghitung hash.

Harapan Anda mungkin tidak realistis - jangan mencoba menghitung hash yang lebih cepat sampai Anda dapat membaca file lebih cepat.

person Anti-weakpasswords    schedule 30.03.2014
comment
Anda benar, tapi saya ragu sistem saya dapat membaca file dengan kecepatan 100MB/s :( Apakah ada cara alternatif untuk membaca file lebih cepat? - person Light Flow; 31.03.2014
comment
Untuk membaca file lebih cepat, Anda memerlukan penyimpanan yang lebih cepat, yang berarti Anda akan menghabiskan banyak uang. Menghapus cadangan di beberapa disk dalam perangkat lunak cadangan Anda, atau RAID, atau SSD, atau SSD dalam RAID, atau PCIe SSD , atau RAMDisk; semua akan bekerja. Sebagai alternatif, jika Anda menggunakan perangkat lunak pencadangan sumber terbuka, minta perangkat lunak tersebut menghitung hash saat menulis hasilnya. Saya tidak bisa mengubah hukum fisika! - person Anti-weakpasswords; 01.04.2014
comment
Hm, ya, sepertinya inilah kebenarannya. Namun, saya akan meluangkan waktu sebelum saya menerima jawaban Anda jika ada orang lain yang ingin menambahkan sesuatu. - person Light Flow; 03.04.2014

Lama dan sudah dijawab, tetapi Anda dapat mencoba memilih potongan file tertentu.

Ada solusi Perl yang saya temukan di suatu tempat dan tampaknya efektif, kode bukan milik saya:

#!/usr/bin/perl

use strict;
use Time::HiRes qw[ time ];
use Digest::MD5;

sub quickMD5 {
    my $fh = shift;
    my $md5 = new Digest::MD5->new;

    $md5->add( -s $fh );

    my $pos = 0;
    until( eof $fh ) {
        seek $fh, $pos, 0;
        read( $fh, my $block, 4096 ) or last;
        $md5->add( $block );
        $pos += 2048**2;
    }
    return $md5;
}

open FH, '<', $ARGV[0] or die $!;
printf "Processing $ARGV[0] : %u bytes\n", -s FH;

my $start = time;
my $qmd5 = quickMD5( *FH );
printf "Partial MD5 took %.6f seconds\n", time() - $start;
print "Partial MD5: ", $qmd5->hexdigest, "\n";

Pada dasarnya skrip menjalankan MD5 pada 4KB pertama untuk setiap blok 4MB dalam file (sebenarnya skrip asli melakukannya setiap 1MB).

person realpclaudio    schedule 26.05.2016
comment
Hm, ide yang menarik! Namun, akan ada masalah jika hanya sebagian kecil file yang rusak setelah 4KB pertama dari blok 2MB.. Tapi bagaimanapun, itu adalah sesuatu yang bagus yang saya tidak tahu!! Terima kasih telah berbagi!! :) - person Light Flow; 26.05.2016
comment
Saya biasanya membuat file md5 sebesar 3,4TB yang saya salin SETIAP HARI ke penyimpanan eksternal. Saat ini saya tidak punya kejutan, namun dengan performa NAS standar MD5 penuh, juga mengingat waktu penyalinan, bukanlah pilihan bagi saya! Pertimbangkan juga Anda melakukan MD5 dengan lebih dari 250.000/300.000 blok data, yang HARUS aman dengan file sebesar itu. - person realpclaudio; 26.05.2016
comment
Bagaimana cara menggunakan skrip ini untuk memeriksa sistem file lengkap dan menulis hasilnya ke file alih-alih memeriksa hanya satu file? - person Sebastian Roy; 12.06.2019
comment
Anda hanya perlu memanggilnya secara eksternal (yaitu dengan skrip bash). Tidak dapat membuat kode saat ini tetapi jika Anda menyalurkan output dari perintah find pada folder sistem file yang relevan ke skrip Perl akan berhasil. dalam skrip bash Anda, Anda harus memiliki sesuatu seperti find /folder/ -type f | xargs perl_script dan arahkan ke file log. - person realpclaudio; 13.06.2019

Saya sarankan Anda melihat hash non-kriptografi (misal: xxhash dan murmur3) mereka jauh lebih cepat daripada md5 hingga tentu saja Anda mencapai kecepatan baca maksimal.

person gmansour    schedule 02.07.2021