如何计算1 TB以上的文件的哈希值?

Lig*_*low 5 hash large-data

因此,我有几个大约1 TB的系统备份映像文件,我想快速计算每个文件的哈希值(最好是SHA-1)。

最初,我尝试计算md5哈希值,已经过去了2个小时,还没有计算出哈希值(对于最大容量为1TB的大型文件,这是显而易见的)。

那么,有没有可以快速哈希1TB文件的程序/实现?

我听说过Tree-Hashing同时散列文件的某些部分,但是到目前为止我还没有找到任何实现。

Ant*_*rds 6

如果您有一个 100 万 MB 的文件,并且您的系统可以以 100MB/s 的速度读取此文件,那么

  • 1TB * 1000(TB/GB) = 1000 GB
  • 1000GB * 1000(MB/GB) = 100 万 MB
  • 100 万 MB/100(MB/s) = 1 万秒
  • 10000s/3600(s/hr) = 2.77... hr
  • 因此,一个 100MB/s 的系统有一个 2.77... 小时的硬地板,甚至在第一时间读取文件,甚至在计算散列可能需要任何额外的总时间之前。

您的期望可能不切实际 - 在您可以执行更快的文件读取之前,不要尝试计算更快的哈希值。


rea*_*dio 5

较旧且已经回答,但是您可以尝试选择特定的文件块。

我在某个地方找到了一个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";
Run Code Online (Sandbox Code Playgroud)

基本上,脚本会在文件中的每个4MB块的前4KB上执行MD5(实际上原始文件是每1MB执行一次MD5)。