我该如何在Perl中计算wav文件的MD5哈希值?

10

我有一个wav文件,需要计算其内容的MD5哈希值。如何使用Perl实现?

7个回答

20

有一个模块可以实现这个功能:Digest::MD5::File。使用它,代码可以简化为:

use Digest::MD5::File qw( file_md5_hex );
my $md5 = file_md5_hex( $some_file_name );

链接失效,代码无法运行(至少在默认的win64版本的Active State Perl上对我而言如此)。 - Kip

12

10

使用Digest::MD5

use Digest::MD5 qw(md5);
my $hash;
{
    local $/ = undef;
    open FILE, "$wav_file_name";
    binmode FILE;
    my $data = <FILE>;
    close FILE;
    $hash = md5($data);
}

或者你可以使用面向对象(OO)接口:

use Digest::MD5;

open FILE, "$wav_file_name";

my $ctx = Digest::MD5->new;
$ctx->addfile (*FILE);
my $hash = $ctx->digest;
close (FILE);

2
最好使用File::Slurp来读取文件: - Sinan Ünür
6
不要完全读取整个文件,WAV 文件可能很大,使用 Digest::MD5 可以从文件句柄中读取:打开 my $fh, '<', $thewav or die "Can't open $thewav: $!\n"; print Digest::MD5->new->add_file($fh)->hexdigest; - hexten

4
以下内容是基于用户hexten在StackOverflow中的评论,对我很有用,应该比那些读取文件的答案表现更好:
use Digest::MD5 qw( md5_hex );

open my $fh, '<', $file;
my $md5 = Digest::MD5->new->addfile($fh)->hexdigest;
close $fh;

目前得票最高的答案建议使用Digest::MD5::File,但至少在ActiveState Perl的最新Windows版本上,这种方法不起作用,并且答案中的链接现在已经失效。

3

只需使用Digest::MD5即可。

根据您的需求,感知哈希也许会很有趣。它允许您通过比较它们的哈希值(相似的内容具有相似的哈希值)来比较文件。然而,就我所知,仍没有 Perl 实现。


2
使用Digest::MD5File::Slurp
#!/usr/bin/perl

use strict;
use warnings;

use Digest::MD5 qw(md5_hex);
use File::Slurp;

my ($input) = @ARGV;

write_file "$input.md5", md5_hex(scalar read_file $input, binmode => ':raw'), "\n";

0

或者 摘要::文件 - Perl v5.20.2 在 Debian Jessie 中

# Poor mans "md5sum" command
use Digest::file qw(digest_file_hex);
for (@ARGV) {
print digest_file_hex($_, "MD5"), "  $_\n";
}

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