我试图在Windows批处理文件中获取base64编码的sha1哈希。 我尝试的第一件事就是使用perl:
perl -M"Digest::SHA1 qw(sha1_base64)" -e "open(F,shift) or die; binmode F; print sha1_base64(<F>), qq(=\n)" "test.mxf"
这很好用,但仅适用于小文件。对于大文件,它说“内存不足”。
然后我下载了一个用于Windows的openssl版本并尝试了这个:
"C:\openssl.exe" dgst -sha1 -binary -out "hash_sha1.txt" "C:\test.mxf"
set /p hash_sha1=<"hash_sha1.txt"
del "hash_sha1.txt"
echo !hash_sha1!
echo -n '!hash_sha1!' | "C:\openssl.exe" enc -base64
但是openssl方法的输出与Perl输出不同,我知道Perl方法产生正确的输出。我需要改变什么?
答案 0 :(得分:4)
-n
没有echo
参数,因此-n
和单引号是输出的一部分。整个代码:
openssl dgst -sha1 -binary "C:\test.mxf" | openssl enc -base64
答案 1 :(得分:2)
如果您创建Digest::SHA1
对象,则可以使用add
方法逐步计算哈希值
也无需显式打开作为命令行参数传递的文件。它们使用内置文件句柄ARGV
自动打开,可以使用empoty菱形运算符<>
perl -Mopen=IN,:raw -MDigest::SHA1 -e"$d=Digest::SHA1->new; $d->add($_) while <>; print $d->b64digest, qq{=\n}" 5GB.bin
这个命令行非常乐意生成一个5GB文件的SHA1哈希值,但如果你不幸的是有一个不包含换行符的非常大的文件,那么你将不得不设置一个读取块大小
local $/ = \(1024*1024)