Hash 如何计算大于等于1 TB的文件的哈希值?

Hash 如何计算大于等于1 TB的文件的哈希值?,hash,large-data,Hash,Large Data,所以,我有两个大约1 TB的系统备份映像文件, 我想快速计算它们中每一个的散列(最好是SHA-1) 起初,我试图计算md5散列,2个小时过去了,散列还没有计算出来(对于1TB以下的大文件来说,这是显而易见的) 那么,是否有任何程序/实现可以快速散列1TB文件 我听说过树散列可以同时散列部分文件,但到目前为止我还没有找到任何实现 如果您有一个100万MB的文件,并且您的系统可以以100MB/s的速度读取该文件,那么 1TB*1000(TB/GB)=1000 GB 1000GB*1000(MB/G

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

起初,我试图计算md5散列,2个小时过去了,散列还没有计算出来(对于1TB以下的大文件来说,这是显而易见的)

那么,是否有任何程序/实现可以快速散列1TB文件


我听说过树散列可以同时散列部分文件,但到目前为止我还没有找到任何实现

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

  • 1TB*1000(TB/GB)=1000 GB
  • 1000GB*1000(MB/GB)=一百万MB
  • 100万MB/100(MB/s)=10000秒
  • 10000s/3600(s/hr)=2.77。。。人力资源
  • 因此,100MB/s系统的硬地板为2.77。。。即使在计算散列所需的额外总时间之前,也需要花费小时来读取文件

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

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

我在某处找到了一个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";
#/usr/bin/perl
严格使用;
使用时间::雇佣qw[时间];
使用Digest::MD5;
sub-quickMD5{
我的$fh=班次;
my$md5=新摘要::md5->新建;
$md5->add(-s$fh);
我的$pos=0;
截止日期(eof$fh){
寻求$fh、$pos,0;
读($fh,my$block,4096)或最后一个;
$md5->add($block);
$pos+=2048**2;
}
返回$md5;
}

打开FH,'你是对的,但我怀疑我的系统能否以100MB/s的速度读取文件:(是否有其他方法可以更快地读取文件?要更快地读取文件,您需要更快的存储,这主要意味着您将要花费大量资金。在备份软件中的多个磁盘上,或在RAID中的、或、或SSD、或PCIe SSD、或RAMDisk中,将备份分条;所有这些都可以工作。或者,如果您使用开源备份软件,让它在写输出的时候计算散列。我可以改变物理定律!嗯,是的,这似乎是事实。但是,我会抽出一些时间接受你的答案,以防其他人想添加一些东西。嗯,有趣的想法!但是,如果只有一小部分文件被破坏,就会有问题在2MB块中的第一个4KB之后的d。但是无论如何,这是我不知道的好东西!!谢谢分享!!:)我通常做MD5的3,4TB文件,我每天复制到外部存储。现在我没有惊喜,BTW与标准NAS性能完全MD5,也给复制时间,不是我的选择!也认为你正在做MD5的超过250000/300000个数据块,这应该是可接受的安全与这么大的文件。我怎么用这个脚本来检查完成文件系统并将结果写入一个文件,而不是只检查一个文件?您只需要在外部调用它(即使用bash脚本)。现在无法编码,但如果您将文件系统相关文件夹上的“find”命令的输出通过管道传输到perl脚本,就可以了“find/folder/-键入f | xargs perl_脚本”并重定向到日志文件。