Python 相当于 Perl Digest::MD5 函数
Python equivalent of Perl Digest::MD5 functions
作为工作项目的一部分,我正在将 Perl 库移植到 Python。我对 Python 很满意,但对 Perl 的感觉要差很多。
perl 代码使用 Digest::MD5。该模块具有三个功能:
md5($data)
接收数据并在 binary 中输出 md5 摘要
md5_hex($data)
接收数据并在 hex 中输出 md5 摘要
md5_base64($data)
接收数据并以 base64 编码输出 md5 摘要
我可以用这样的东西复制 md5_hex:
import hashlib
string = 'abcdefg'
print(hashlib.md5(string.encode()).hexdigest())
效果很好(相同的输入至少产生相同的输出)。我似乎无法找到与其他两个功能相匹配的东西。
字符串编码真的不是我做过的很多事情,这无济于事。我一直将 perl 函数解释为说它们采用 md5 摘要,然后以二进制或 base64 重新编码,如下所示:
import hashlib
import base64
string = 'abcdefg'
md5_string = hashlib.md5(string.encode()).hexdigest()
print(base64.b64encode(md5_string))
但也许这是错误的?我确定我只是缺少一些基本的东西。
Perl 文档在这里:
https://metacpan.org/pod/Digest::MD5
第一个只是调用 md5
上的 .digest
方法:
>>> from hashlib import md5
>>> s = 'abcdefg'
>>> md5(s.encode()).digest()
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'
而 md5_base64
是摘要,但采用 base64 编码:
>>> base64.b64encode(md5(s.encode()).digest())
b'esZsDxSN6VGbi9JkMSxNZA=='
但是,Perl 不会 return 散列填充,因此为了兼容,您需要去除 =
填充字符:
>>> base64.b64encode(md5(s.encode()).digest()).strip(b'=')
b'esZsDxSN6VGbi9JkMSxNZA'
首先,注意 Digest::MD5 文档:
Note that the base64 encoded string returned is not padded to be a multiple of 4 bytes long. If you want interoperability with other base64 encoded md5 digests you might want to append the redundant string "==" to the result.
其次,请注意您要对哈希进行 Base64 编码,而不是它的十六进制表示:
print(base64.b64encode(hashlib.md5(string.encode()).digest()))
esZsDxSN6VGbi9JkMSxNZA==
perl -MDigest::MD5=md5_base64 -E 'say md5_base64($ARGV[0])' abcdefg
esZsDxSN6VGbi9JkMSxNZA
作为工作项目的一部分,我正在将 Perl 库移植到 Python。我对 Python 很满意,但对 Perl 的感觉要差很多。
perl 代码使用 Digest::MD5。该模块具有三个功能:
md5($data)
接收数据并在 binary 中输出 md5 摘要
md5_hex($data)
接收数据并在 hex 中输出 md5 摘要
md5_base64($data)
接收数据并以 base64 编码输出 md5 摘要
我可以用这样的东西复制 md5_hex:
import hashlib
string = 'abcdefg'
print(hashlib.md5(string.encode()).hexdigest())
效果很好(相同的输入至少产生相同的输出)。我似乎无法找到与其他两个功能相匹配的东西。
字符串编码真的不是我做过的很多事情,这无济于事。我一直将 perl 函数解释为说它们采用 md5 摘要,然后以二进制或 base64 重新编码,如下所示:
import hashlib
import base64
string = 'abcdefg'
md5_string = hashlib.md5(string.encode()).hexdigest()
print(base64.b64encode(md5_string))
但也许这是错误的?我确定我只是缺少一些基本的东西。
Perl 文档在这里: https://metacpan.org/pod/Digest::MD5
第一个只是调用 md5
上的 .digest
方法:
>>> from hashlib import md5
>>> s = 'abcdefg'
>>> md5(s.encode()).digest()
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'
而 md5_base64
是摘要,但采用 base64 编码:
>>> base64.b64encode(md5(s.encode()).digest())
b'esZsDxSN6VGbi9JkMSxNZA=='
但是,Perl 不会 return 散列填充,因此为了兼容,您需要去除 =
填充字符:
>>> base64.b64encode(md5(s.encode()).digest()).strip(b'=')
b'esZsDxSN6VGbi9JkMSxNZA'
首先,注意 Digest::MD5 文档:
Note that the base64 encoded string returned is not padded to be a multiple of 4 bytes long. If you want interoperability with other base64 encoded md5 digests you might want to append the redundant string "==" to the result.
其次,请注意您要对哈希进行 Base64 编码,而不是它的十六进制表示:
print(base64.b64encode(hashlib.md5(string.encode()).digest()))
esZsDxSN6VGbi9JkMSxNZA==
perl -MDigest::MD5=md5_base64 -E 'say md5_base64($ARGV[0])' abcdefg
esZsDxSN6VGbi9JkMSxNZA