perl Digest add addfile计算不同的SHA1摘要
发布时间:2020-12-15 23:32:57 所属栏目:大数据 来源:网络整理
导读:perl Digest模块为add和addfile函数计算不同的SHA1摘要. 我使用/ dev / urandom创建了二进制随机数据 在ubuntu上运行 $lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 12.04.1 LTSRelease: 12.04Codename: precise$
perl Digest模块为add和addfile函数计算不同的SHA1摘要.
我使用/ dev / urandom创建了二进制随机数据 在ubuntu上运行 $lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 12.04.1 LTS Release: 12.04 Codename: precise $perl -v This is perl 5,version 14,subversion 2 (v5.14.2) built for i686-linux-gnu-thread-multi-64int 脚本输出 $perl t.pl sha1 a.tmp doesntwork da39a3ee5e6b4b0d3255bfef95601890afd80709 works ee49451434cffe001a568090c86f16f076677af5 $openssl dgst -sha1 a.tmp SHA1(a.tmp)= ee49451434cffe001a568090c86f16f076677af5 在我的代码中跟随 use strict; use warnings; use Switch; use Digest; sub doesntwork { my ($datafile,$hashfun) = @_; open(my $fh,"<",$datafile ) or die "error: Can't open '$datafile',$!n"; binmode($fh); read($fh,my $data,-s $datafile); close($fh); $hashfun->add($data); my $hashval = $hashfun->digest(); return unpack('H*',$hashval); } sub works { my ($datafile,$!n"; binmode($fh); $hashfun->addfile($fh); my $hashval = $hashfun->digest(); close($fh); return unpack('H*',$hashval); } ############################################################################### (@ARGV >= 2) or die "usage: perl $0 algo datafilen"; my ($algo,$datafile) = @ARGV; my $hashfun; switch($algo) { case "md5" {$hashfun = Digest->new("MD5" );} case "sha1" {$hashfun = Digest->new("SHA-1" );} case "sha256" {$hashfun = Digest->new("SHA-256");} case "sha512" {$hashfun = Digest->new("SHA-512");} else {die "error: invalid algorithm '$algo'n"} } print "doesntworkt",doesntwork( $datafile,$hashfun ),"n"; print "works t",works ( $datafile,"n"; 我想添加函数来工作,因为我想在缓冲数据上计算它,而不是从文件数据计算.可能的add将数据视为文本,而对于addfile,文件句柄上的binmod使其使用二进制数据,如果是这样,我怎样才能将缓冲区视为二进制数据. 编辑帖子打印数据读取大小 – $stat -c "%n %s" a.tmp a.tmp 671088640 $openssl dgst -sha1 a.tmp SHA1(a.tmp)= 7dfcced1b0c8864e6a20b2daa63de7ffc1cd7a26 #### Works $perl -W -MDigest -e 'open(my $fh,"a.tmp") or die "cant open $!n"; > binmode($fh); > my $hf = Digest->new("SHA-1"); > $hf->addfile($fh); > print unpack("H*",$hf->digest()),"n"; > close($fh);' 7dfcced1b0c8864e6a20b2daa63de7ffc1cd7a26 #### Doesnt Work $perl -W -MDigest -e 'open(my $fh,"a.tmp") or die "cant open $!n"; > binmode($fh); > read($fh,-s "a.tmp") or die "cant read $!n"; > close($fh); > printf("## data.length=%d,file.length=%dn",length($data),-s "a.tmp"); > length($data)==(-s "a.tmp") or die "couldnt read all the data"; > my $hf = Digest->new("SHA-1"); > $hf->add($data); > print unpack("H*","n";' ## data.length=671088640,file.length=671088640 9eecafd368a50fb240e0388e3c84c0c94bd6cc2a 根据弗雷德的回答也试过了 $perl -W -MDigest -e ' > open(my $fh,"a.tmp") or die "cant open $!n"; > binmode($fh); > my $size = -s "a.tmp"; > my $got = read($fh,$size) or die "cant read $!n"; > print "##read $got bytes,size=$sizen"; > my $done = $size - $got; > print "done=$done,size=$size,got=$gotn"; > until(!$done) { > $got = read($fh,my $newdata,$done); > $done -= $got ; > $data .= $newdata; > print "##read1 $got bytes,done=$donen"; > } > close($fh); > printf("## data.length=%d,"n";' ##read 671088640 bytes,size=671088640 done=0,size=671088640,got=671088640 ## data.length=671088640,file.length=671088640 9eecafd368a50fb240e0388e3c84c0c94bd6cc2a 解决方法
您还没有提供产生问题的数据,但我不能使用Perl脚本作为输入来复制您的问题.
这是addfile的定义: sub addfile { my ($self,$handle) = @_; my $n; my $buf = ""; while (($n = read($handle,$buf,4*1024))) { $self->add($buf); } unless (defined $n) { require Carp; Carp::croak("Read failed: $!"); } $self; } 你声称addfile工作和添加没有多大意义.我想在处理长字符串时模块中可能存在错误,但是你更有可能将不同的输入传递给模块. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |