#! /usr/bin/perl
use warnings;
use strict;
use Digest::SHA;
die "Usage: $0 file ..\n" unless @ARGV;
foreach my $file (@ARGV) {
my $sha1 = Digest::SHA->new(1); # use 1 for SHA1, 256 for SHA256, ...
$sha1->addfile($file);
say($sha1->hexdigest, " $file");
}
#!/usr/bin/perl -w
use v5.10; # for 'say'
use strict;
require Digest::SHA1;
my $filename = 'secure.txt';
my $sha1 = Digest::SHA1->new->addfile($filename)->hexdigest;
say $sha1;
#!/usr/bin/perl -w
use strict;
use Digest::SHA1 qw/ sha1_hex /;
my $filename = "secure.txt";
# open file
open my $fhi, '<', $filename or die "Cannot open file '$filename' for reading: $!";
# slurp all the file contents
my $file_contents;
{local $/; $file_contents = <$fhi>;}
close $fhi;
print &sha1_hex($file_contents);
4条答案
按热度按时间6tqwzwtp1#
perlrun中记录了Perl的命令行选项。在上面的命令中从左到右依次为:
-MDigest::SHA1=sha1_hex
在编译时加载Digest::SHA1模块并导入sha1_hex
,sha1_hex
以十六进制形式给出摘要。-l
会自动在任何print
的结尾加入新行-e
引入了要执行的Perl代码这个看起来很有趣的菱形是Perl的
readline
运算符的特例:空文件句柄
<>
很特殊:它可以用来模拟sed
和awk
的行为。<>
的输入来自标准输入,或者来自命令行中列出的每个文件。下面是它的工作原理:第一次计算<>
时,检查@ARGV
数组,如果它为空,则将$ARGV[0]
设置为"-"
,当打开"-"
时,将提供标准输入。然后将@ARGV
数组作为文件名列表进行处理。因为
secure.txt
是命令行上唯一命名的文件,所以其内容成为sha1_hex
的参数。使用Perl 5.10或更高版本,可以将上面的单行程序缩短五个字符。
该代码删除
<>
前面的可选(对于所有版本的Perl)空格,删除-l
,并从-e
切换到-E
。*一米二一米一
行为与
-e
类似,只是它隐式启用所有可选功能(在主编译单元中)。请参阅feature
。这些可选特性之一是
say
,它使得-l
变得不必要。*一米二十六分一秒
*一米二十七分一秒
*一米二十八分一秒
就像
print
一样,但隐式附加了一个换行符。say LIST
只是此关键字仅在启用
say
功能时可用:参见feature
。如果您希望将此代码放在一个方便的实用程序中,例如
mysha1sum.pl
,则使用这将为命令行中命名的每个文件计算摘要,输出格式与Unix
sha1sum
实用程序的格式兼容。你没有说你是否安装了Cygwin,但是如果你安装了,
sha1sum
是coreutils包的一部分。smdnsysy2#
尝试Digest::SHA模块。
ie3xauqp3#
在撰写本文时,Strawberry Perl和ActiveState Perl都包含Digest::SHA附带的
shasum
命令。如果您在安装过程中选择了默认选项,则%PATH%
中已包含该命令。如果您真的想为Digest::SHA编写自己的 Package 器,这里的其他答案也很好。
如果您只想“使用Perl”来获取文件的SHA1哈希值,也就是说,您 * 拥有 * ActiveState Perl,并且它附带了
shasum
命令行实用程序,那么就像下面这样简单:默认哈希算法为SHA1;如果您想显式地添加
-a1
(这不是一个坏主意)。默认的输出格式是hash,两个空格,然后是文件名。这与
sha1sum
和类似的实用程序的格式相同,常见于Unix/Linux系统。如果重定向到一个文件,该文件名可以在稍后提供给shasum -c
,以验证您之前哈希过的任何文件的完整性。如果你真的不想看到文件名,只想看到SHA1哈希,这两个方法都会去掉文件名部分:
使用Powershell:
使用命令提示符(旧式批处理脚本):
对于第二个,如果要将其放入
.cmd
或.bat
文件中,请确保使用%%i
而不是%i
(两个位置)。8zzbczxx4#
Digest::SHA1
的用法如下:使用OO策略:
->hexdigest
会导致对象的状态被清除,从而导致正在计算的当前摘要被销毁。此时,您可以重用$sha1
对象。*你也可以对文件内容使用
sha1_hex
sub:请注意,您可以改用
Digest::SHA
,其中new()
将算法作为参数使用(例如,1表示SHA1,256表示SHA256,...):