Компактный способ получения контрольной суммы файла в Perl

Я ищу способы получить контрольные суммы файлов в Perl, но не путем выполнения системной команды cksum -- хотел бы сделать это в Perl, потому что скрипт должен быть переносимым между UNIX и Windows. cksum <FILENAME> | awk '{ print }' работает в UNIX, но, очевидно, не в Windows. Я исследовал MD5 в но кажется, что получение дескриптора файла необходимо, и обычно это не кажется очень компактным способом получить эти данные (предпочтительнее однострочный).

есть лучше способ?

3 ответов


вот три разных способа в зависимости от того, какие модули у вас есть:

use Digest::MD5 qw(md5_hex);

use File::Slurp;
print md5_hex(read_file("filename")), "\n";

use IO::All;
print md5_hex(io("filename")->all), "\n";

use IO::File;
print md5_hex(do { local $/; IO::File->new("filename")->getline }), "\n";

не полностью однострочный, но довольно близко.

заменить Digest::MD5 С любым хэш-алгоритмом, который вы хотите, например SHA1.

IO::File находится в ядре и должен быть доступен везде, но это решение мне лично не нравится больше всего. В любом случае, это работает.


Я не мог сделать что-либо из вышеперечисленного для меня в windows, я всегда получал неправильный MD5. Я заподозрил, что это вызвано различиями в linebreak, но преобразование файла в DOS или unix не имело никакого значения. Тот же код с тем же файлом даст мне правильный ответ на linux и неправильный в windows. Прочитав документацию, я наконец нашел то, что будет работать как в windows, так и в linux:

use Digest::MD5;
open ($fh, '<myfile.txt');
binmode ($fh);
print Digest::MD5->new->addfile($fh)->hexdigest;

Я надеюсь, что это помогает другим людям испытывая трудности в windows, я нахожу это настолько странным, что я не нашел никаких упоминаний о проблемах в windows...


Это также работает:

use Digest::MD5 qw(md5_base64);
...
            open(HANDLE, "<", $dirItemPath);
            my $cksum = md5_base64(<HANDLE>);
            print "\nFile checksum = ".$cksum;