【发布时间】:2014-05-08 14:50:02
【问题描述】:
所以,我有几个大约 1 TB 的系统备份映像文件, 我想快速计算它们中的每一个的哈希值(最好是 SHA-1)。
起初我尝试计算 md5 哈希值,2 小时过去了,但尚未计算哈希值(这对于高达 1TB 的大文件来说很明显)。
那么有没有可以快速散列 1TB 文件的程序/实现?
我听说过同时对部分文件进行哈希处理的 Tree-Hashing,但到目前为止我还没有找到任何实现。
【问题讨论】:
标签: hash large-data
所以,我有几个大约 1 TB 的系统备份映像文件, 我想快速计算它们中的每一个的哈希值(最好是 SHA-1)。
起初我尝试计算 md5 哈希值,2 小时过去了,但尚未计算哈希值(这对于高达 1TB 的大文件来说很明显)。
那么有没有可以快速散列 1TB 文件的程序/实现?
我听说过同时对部分文件进行哈希处理的 Tree-Hashing,但到目前为止我还没有找到任何实现。
【问题讨论】:
标签: hash large-data
如果你有一个 100 万 MB 的文件,并且你的系统可以以 100MB/s 的速度读取这个文件,那么
您的期望可能不切实际 - 在您可以执行更快的文件读取之前,不要尝试计算更快的哈希值。
旧且已回答,但您可以尝试选择特定的文件块。
我在某处找到了一个 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 执行一次)。
【讨论】: