加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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工作和添加没有多大意义.我想在处理长字符串时模块中可能存在错误,但是你更有可能将不同的输入传递给模块.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读