作为工作项目的一部分,我正在将Perl库移植到Python。我对Python很满意,但对于Perl来说,情况就差得多了。
perl代码使用摘要:MD5。该模块有三个功能:
md5($data)接收数据,并以二进制方式输出md5摘要。md5_hex($data)接收数据,并以十六进制方式输出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
发布于 2016-10-17 20:13:37
第一个方法只是调用md5上的md5方法。
>>> from hashlib import md5
>>> s = 'abcdefg'
>>> md5(s.encode()).digest()
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'md5_base64是摘要,但base64 64编码:
>>> base64.b64encode(md5(s.encode()).digest())
b'esZsDxSN6VGbi9JkMSxNZA=='但是,Perl不返回散列填充,因此,为了兼容,需要去掉=填充字符:
>>> base64.b64encode(md5(s.encode()).digest()).strip(b'=')
b'esZsDxSN6VGbi9JkMSxNZA'发布于 2016-10-17 20:14:03
首先,注意摘要:MD5文档:
请注意,返回的base64编码字符串不会填充为4字节长的倍数。如果您希望与其他base64编码的md5摘要具有互操作性,则可能需要将冗余字符串"==“附加到结果中。
其次,请注意,您希望对散列进行Base64编码,而不是对它的十六进制表示形式进行编码:
print(base64.b64encode(hashlib.md5(string.encode()).digest()))
esZsDxSN6VGbi9JkMSxNZA==
perl -MDigest::MD5=md5_base64 -E 'say md5_base64($ARGV[0])' abcdefg
esZsDxSN6VGbi9JkMSxNZA
https://stackoverflow.com/questions/40094746
复制相似问题