【问题标题】:Perl comparing md5'sPerl 比较 md5 的
【发布时间】:2013-12-05 22:46:27
【问题描述】:

我使用以下脚本来获取文件的 md5,它按预期工作:

use warnings;
use strict;
use Digest::MD5;

my $file = "$ARGV[0]";
open (my $fh, '<', $file) or die "Can't open '$file': $!";
binmode ($fh);

my $md5 = Digest::MD5->new->addfile($fh)->hexdigest;
print $file, "\n", $md5, "\n"; 

我想做的是使用上面的脚本,然后将 $md5 与另一个已知的 md5 进行比较。

编辑: 这个想法是检查某些预定义文件的有效性。我已经知道“好”文件的 md5,我只需要将已知的 md5 与从上述脚本中获得的 md5 进行比较。我只是不确定下一步该怎么做。

编辑 2: 我已经想出了如何使用push(@array, $filehandle); 将对象推送到数组中,现在我只需要使用预定义的 md5s 创建另一个数组,这引发了我的下一个问题,有没有办法查看array A 中的一个条目是否相同作为array B 中的ANY 条目?

编辑 3: 我已经想出了如何实际比较两个 md5 这样做:

use warnings;
use strict;
use Digest::MD5;

my $file = "$ARGV[0]";
my $file1 = "$ARGV[1]";
open (my $fh, '<', $file) or die "Can't open '$file': $!";
binmode ($fh);

open (my $fh1, '<', $file1) or die "Can't open '$file': $!";
binmode ($fh1);

my $md5 = Digest::MD5->new->addfile($fh)->hexdigest;
my $md51 = Digest::MD5->new->addfile($fh1)->hexdigest;

print "\n", $file, "\n", $md5, "\n", "\n", $file1, "\n", $md51, "\n";

if ($md5 eq $md51) {
    print "\n", "The MD5's match perfectly", "\n";
} else { 
    print "\n", "The MD5's do NOT match", "\n";
}

但这会比较两个 args 的 md5。我需要弄清楚的是如何将 argv0 md5 与整个预定义 md5 数组进行比较。

【问题讨论】:

  • 另外,我不确定将已知的 md5 存储到文件中还是将已知的 md5 合并到脚本本身会更好。任何有关实现此目标的最佳方法的见解将不胜感激。
  • 您可以将 md5 摘要存储在 ie 中。 "$file.md5" 文件

标签: perl md5


【解决方案1】:

您可以将预期的 MD5 值作为脚本的参数:

#!/usr/bin/perl

use warnings;
use strict;
use Digest::MD5;
use Getopt::Std;

our $opt_e;

getopt( 'e:' );

my $file = "$ARGV[0]";
open( my $fh, '<', $file ) or die "Can't open '$file': $!";
binmode( $fh );

my $md5 = Digest::MD5->new->addfile( $fh )->hexdigest;
print $file, "\n", $md5, "\n";

if ( defined $opt_e ) {
  if ( $md5 eq $opt_e ) {
    print "MD5 value matches. Rejoice!\n";
  }
  else {
    print "MD5 value does not match expected\n";
  }
}

不过,这一切都已在之前使用 md5sum 命令完成,因此最好调查一下。

【讨论】:

  • 更新了原始帖子以反映我的立场。
【解决方案2】:

这个小脚本正是我想要的。此代码将接受任何文件作为参数,然后它将获取该文件的 md5 摘要。一旦有了 md5,它就会将它与整个数组进行比较。我现在唯一的问题是......如果我有 1200 个 md5,那会减慢脚本的速度吗?我正在检查的 md5 将位于永远不会更改的文件名上。添加多个数组是否会更快,每个文件名一个,然后它将读取文件名并仅搜索该数组。谢谢大家的帮助,我相信迟早会回来的。哈哈

use warnings;
use strict;
use Digest::MD5;

my $file = "$ARGV[0]";
open (my $fh, '<', $file) or die "Can't open '$file': $!";
binmode ($fh);

my $md5 = Digest::MD5->new->addfile($fh)->hexdigest;

print "\n", $file, "\n", $md5, "\n";


my @array = ('d41d8cd98f00b204e9800998ecf8427e', 'd6721344ed0cdc2e8a054a68b7ebc365', 'cee8eb94fd83f8d534bc44bf136ebaa0');
    if( $md5 ~~ @array ) {
        print "matches array\n";
} else {
    print "does not match array\n";
}
system ( 'pause' );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多