2009-06-24 4 views

ответ

12

Уверенный, вы можете. Просто найдите Digest::MD5 для хеширующей части и any WAV-related module, если вы хотите хэш определенной части файла (например, пропускать метаданные).

3

Просто используйте Digest::MD5.

В зависимости от ваших потребностей, Perceptual Hashing может быть интересным, кстати. Это позволяет сравнивать файлы, сравнивая их хэши (аналогичное содержимое имеет похожие хэши). Однако до сих пор не существует какой-либо Perl-реализации AFAIK.

9

Использование 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); 
+1

Гораздо лучше хлебать с помощью File :: Slurp: –

+5

Или не хлебать весь файл на все ... WAV файлы могут быть большими и Digest :: MD5 будет считываться из дескриптора: открыть свой $ Ф.Х., '<', $ thewav или die "Невозможно открыть $ thewav: $! \ n"; print Digest :: MD% -> new-> add_file ($ fh) -> hexdigest; – hexten

2

Использование File::Slurp с Digest::MD5:

#!/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"; 
19

Существует модуль для него: Digest::MD5::File. При этом код упрощается:

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

ссылка мертва и код не запускается (по крайней мере для меня по умолчанию win64 build из активного состояния perl) – Kip

2

В следующем, на основе a comment by user hexten, работает для меня, и должны работать лучше, чем ответов, хлюпая файл:

use Digest::MD5 qw(md5_hex); 

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

(в данный момент) Наивысшая -voted ответ предлагает использовать Digest::MD5::File, но это не работает для меня, по крайней мере, на последней версии Windows ActiveState Perl, и ссылка в ответе теперь мертва.

Смежные вопросы