如何计算在Windows批处理sha1 base64编码?

我想获得一个Windowsbatch file中的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" 

这很好,但只适用于小文件。 大文件说“内存不足”。

然后我下载了一个openssl的windows版本,并尝试这样做:

 "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方法会产生正确的输出。 我需要改变什么?

Solutions Collecting From Web of "如何计算在Windows批处理sha1 base64编码?"

  • 没有echo-n参数,所以-n和单引号是输出的一部分。
  • 中间文件和变量不需要,使用管道。

整个代码:

 openssl dgst -sha1 -binary "C:\test.mxf" | openssl enc -base64 

如果创建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)