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

8

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

起初,我尝试计算md5哈希值,但已经过去了2小时,哈希值还没有被计算出来(对于大于1TB的大文件这是很明显的事情)。

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

我听说过树哈希(Tree-Hashing),可以同时哈希文件的部分内容,但我到目前为止还没有发现任何实现。

3个回答

8
如果您有一个1百万MB的文件,并且您的系统可以以100MB/s的速度读取该文件,则:
  • 1TB * 1000(TB/GB) = 1000 GB
  • 1000GB * 1000(MB/GB) = 1百万MB
  • 1百万MB/100(MB/s) = 10千秒
  • 10000s/3600(s/hr) = 2.77...小时
  • 因此,一个100MB/s的系统需要至少2.77小时才能读取该文件,甚至还需要额外的时间来计算哈希值。
您的期望可能是不现实的 - 在您可以进行更快的文件读取之前,请不要尝试计算更快的哈希值。

你说得没错,但我怀疑我的系统无法以100MB/s的速度读取文件 :( 有没有其他更快的读取文件的方法? - Light Flow
1
为了更快地读取文件,您需要更快的存储设备,这通常意味着您将花费大量的资金。在备份软件中跨多个磁盘进行备份、使用RAID、SSD或RAID中的SSD、PCIe SSD或RAMDisk等都可以起到作用。或者,如果您正在使用开源备份软件,请让它在写入输出时计算哈希值。我无法改变物理定律! - Anti-weakpasswords
嗯,是的,看起来这是事实。不过,在我接受你的答案之前,我会抽出些时间,以防其他人想要补充什么。 - Light Flow

6

虽然这个问题已经有答案了,但您可以尝试选择文件的特定部分。

我在某个地方找到了一个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执行一次)。


嗯,有趣的想法!然而,如果在2MB块的前4KB之后只有一个小部分文件损坏,那么就会出现问题。但无论如何,这是我不知道的好东西!谢谢分享! :) - Light Flow
我通常对3、4TB的文件进行MD5运算,这些文件我每天都要拷贝到外部存储中。到目前为止,我还没有遇到过意外情况。但是考虑到标准NAS性能下的全盘MD5计算以及拷贝时间,这对我来说不是一个可行的选择!此外,需要考虑对超过250000/300000个数据块进行MD5计算,在如此大的文件中这应该是可以接受的安全性。 - user3523425
我该如何使用这个脚本来检查完整的文件系统并将结果写入文件,而不仅仅是检查一个文件? - Sebastian Roy
你只需要在外部调用它(例如使用bash脚本)。如果你将相关文件系统的文件夹上“find”命令的输出传输到Perl脚本中,就可以解决问题。在你的bash脚本中,应该有类似于“find /folder/ -type f | xargs perl_script”的内容,并将其重定向到日志文件中。 - user3523425

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接