จะคำนวณแฮชของไฟล์ที่มีขนาด 1 เทราไบต์ขึ้นไปได้อย่างไร

ฉันมีไฟล์อิมเมจสำรองระบบสองสามไฟล์ที่มีขนาดประมาณ 1 เทราไบต์ และฉันต้องการคำนวณแฮชของแต่ละไฟล์อย่างรวดเร็ว (ควรเป็น SHA-1)

ตอนแรกฉันพยายามคำนวณแฮช md5 ผ่านไป 2 ชั่วโมงแล้วและยังไม่ได้คำนวณแฮช (สิ่งที่ชัดเจนสำหรับไฟล์ขนาดใหญ่ถึง 1TB)

มีโปรแกรม/การใช้งานใดบ้างที่สามารถแฮชไฟล์ขนาด 1TB ได้อย่างรวดเร็ว?

ฉันเคยได้ยินเกี่ยวกับ Tree-Hashing ที่แฮชบางส่วนของไฟล์พร้อมกัน แต่ฉันยังไม่พบการใช้งานใด ๆ


person Light Flow    schedule 28.03.2014    source แหล่งที่มา


คำตอบ (3)


หากคุณมีไฟล์ขนาด 1 ล้าน MB และระบบของคุณสามารถอ่านไฟล์นี้ได้ที่ความเร็ว 100MB/s

  • 1TB * 1000(TB/GB) = 1000 GB
  • 1,000GB * 1,000(MB/GB) = 1 ล้าน MB
  • 1 ล้าน MB/100(MB/s) = 10,000 วินาที
  • 10000s/3600(s/hr) = 2.77... hr
  • ดังนั้น ระบบ 100MB/s จึงมีพื้นแข็งที่ 2.77... ชม. ในการอ่านไฟล์ตั้งแต่แรก แม้กระทั่งก่อนที่จะต้องใช้เวลาทั้งหมดเพิ่มเติมในการคำนวณแฮชก็ตาม

ความคาดหวังของคุณอาจไม่สมจริง - อย่าพยายามคำนวณแฮชที่เร็วขึ้นจนกว่าคุณจะสามารถอ่านไฟล์ได้เร็วขึ้น

person Anti-weakpasswords    schedule 30.03.2014
comment
คุณพูดถูก แต่ฉันสงสัยว่าระบบของฉันสามารถอ่านไฟล์ได้ที่ความเร็ว 100MB/s :( มีวิธีอื่นในการอ่านไฟล์เร็วขึ้นหรือไม่ - person Light Flow; 31.03.2014
comment
หากต้องการอ่านไฟล์เร็วขึ้น คุณต้องมีพื้นที่จัดเก็บข้อมูลที่เร็วขึ้น ซึ่งโดยส่วนใหญ่หมายความว่าคุณกำลังจะเสียเงินเป็นจำนวนมาก การแยกข้อมูลสำรองออกจากดิสก์หลายตัวในซอฟต์แวร์สำรองข้อมูลของคุณ หรือ RAID หรือ SSD หรือ SSD ใน RAID หรือ PCIe SSD หรือ RAMDisk; ทั้งหมดจะทำงาน หรืออีกวิธีหนึ่ง หากคุณใช้ซอฟต์แวร์สำรองข้อมูลแบบโอเพ่นซอร์ส ให้ซอฟต์แวร์คำนวณแฮชขณะเขียนเอาต์พุต ฉันสามารถเปลี่ยนกฎแห่งฟิสิกส์ได้! - person Anti-weakpasswords; 01.04.2014
comment
อืมใช่ ดูเหมือนว่านี่คือความจริง อย่างไรก็ตาม ฉันจะสละเวลาก่อนที่จะยอมรับคำตอบของคุณ เผื่อว่ามีคนต้องการเพิ่มบางอย่าง - person Light Flow; 03.04.2014

เก่าและตอบแล้ว แต่คุณอาจลองเลือกไฟล์เฉพาะเจาะจง

มีวิธีแก้ไขปัญหา Perl ที่ฉันพบที่ไหนสักแห่งและดูเหมือนว่าจะมีประสิทธิภาพ ไม่ใช่รหัสของฉัน:

#!/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";

โดยพื้นฐานแล้วสคริปต์จะดำเนินการ MD5 บน 4KB แรกสำหรับทุก ๆ บล็อก 4MB ในไฟล์ (อันที่จริงสคริปต์ต้นฉบับทำทุก ๆ 1MB)

person realpclaudio    schedule 26.05.2016
comment
อืม ความคิดน่าสนใจ! อย่างไรก็ตาม มันจะเกิดปัญหาขึ้นหากไฟล์เสียหายเพียงส่วนเล็กๆ หลังจากบล็อกขนาด 2MB ขนาด 4KB แรก.. แต่อย่างไรก็ตาม มันก็เป็นสิ่งดีที่ฉันไม่รู้!! ขอบคุณสำหรับการแบ่งปัน!! :) - person Light Flow; 26.05.2016
comment
ฉันมักจะทำไฟล์ md5 จาก 3,4TB ที่ฉันคัดลอกไปยังที่จัดเก็บข้อมูลภายนอกทุกวัน ถึงตอนนี้ฉันไม่แปลกใจแล้ว แม้ว่า NAS มาตรฐานจะแสดง MD5 เต็มรูปแบบและมีเวลาในการคัดลอกด้วย แต่ก็ไม่ใช่ตัวเลือกสำหรับฉัน! นอกจากนี้ ให้พิจารณาด้วยว่าคุณกำลังทำ MD5 มากกว่า 250,000/300,000 บล็อกข้อมูล ซึ่งควรจะปลอดภัยกับไฟล์ขนาดใหญ่มาก - person realpclaudio; 26.05.2016
comment
ฉันจะใช้สคริปต์นี้เพื่อตรวจสอบระบบไฟล์ทั้งหมดและเขียนผลลัพธ์ลงในไฟล์แทนที่จะตรวจสอบเพียงไฟล์เดียวได้อย่างไร - person Sebastian Roy; 12.06.2019
comment
คุณเพียงแค่ต้องเรียกมันจากภายนอก (เช่น ด้วยสคริปต์ทุบตี) ไม่สามารถเขียนโค้ดได้ในขณะนี้ แต่ถ้าคุณไพพ์เอาต์พุตของคำสั่ง find บนโฟลเดอร์ที่เกี่ยวข้องของระบบไฟล์ไปยังสคริปต์ Perl ก็ควรทำเคล็ดลับ ในสคริปต์ทุบตีของคุณคุณควรมีสิ่งเช่น find /folder/ -type f | xargs perl_script และเปลี่ยนเส้นทางไปยังไฟล์บันทึก - person realpclaudio; 13.06.2019

ฉันขอแนะนำให้คุณดูแฮชที่ไม่ใช่การเข้ารหัส (เช่น: xxhash และ murmur3) พวกมันเร็วกว่า md5 มาก จนกระทั่งถึงความเร็วการอ่านสูงสุดอย่างแน่นอน

person gmansour    schedule 02.07.2021