如何计算 windows 批次中编码的 sha1 base64?
How to calculate sha1 base64 encoded in windows batch?
我正在尝试在 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"
这很好用,但只适用于小文件。对于大文件,它说 "Out of memory".
然后我下载了 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 方法产生正确的输出。我需要更改什么?
echo
没有 -n
参数,所以 -n
AND 单引号是输出的一部分。
- 不需要中间文件和变量,使用管道。
完整代码:
openssl dgst -sha1 -binary "C:\test.mxf" | openssl enc -base64
如果创建Digest::SHA1
对象,可以使用add
方法增量计算hash
也不需要显式打开作为命令行参数传递的文件。它们使用内置文件句柄 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)
我正在尝试在 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"
这很好用,但只适用于小文件。对于大文件,它说 "Out of memory".
然后我下载了 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 方法产生正确的输出。我需要更改什么?
echo
没有-n
参数,所以-n
AND 单引号是输出的一部分。- 不需要中间文件和变量,使用管道。
完整代码:
openssl dgst -sha1 -binary "C:\test.mxf" | openssl enc -base64
如果创建Digest::SHA1
对象,可以使用add
方法增量计算hash
也不需要显式打开作为命令行参数传递的文件。它们使用内置文件句柄 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)