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

时间:2014-03-28 23:12:24

标签: hash large-data

所以,我有几个大约1 TB的系统备份映像文件, 我想快速计算每一个的散列(最好是SHA-1)。

起初我尝试计算md5哈希,2小时过去了,哈希还没有计算好(对于大到1TB的大文件来说这是显而易见的。)

那么有没有可以快速散列1TB文件的程序/实现?

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

3 个答案:

答案 0 :(得分: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";

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

答案 1 :(得分:3)

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

  • 1TB * 1000(TB / GB)= 1000 GB
  • 1000GB * 1000(MB / GB)= 1百万MB
  • 100万MB / 100(MB / s)= 10万秒
  • 10000s / 3600(s / hr)= 2.77 ... hr
  • 因此,即使在计算哈希值之前需要额外的总时间之前,100MB / s系统的硬盘最低可达2.77 ...小时甚至可以读取文件。

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

答案 2 :(得分:0)

我建议您查看非加密哈希(例如:xxhashmurmur3),它们比 md5 快得多,当然直到您达到最大读取速度。