Python 3.6是否等效于md5摘要()方法?

时间:2018-08-04 22:32:39

标签: python python-3.x python-2.7 md5 cryptographic-hash-function

我无法在Python 3.6中获得与python 2.7相同的md5摘要()方法结果。

Python 2.7:

rose:

Python 3.6:

import md5

encryption_base  = 'cS35jJYp15kjQf01FVqA7ubRaNOXKPmYGRbLUiimX0g3frQhzOZBmTSni4IEjHLWYMMioGaliIz5z8u2:abcdefghkmnopqrstuvwxyz:4'
digest = md5.new (encryption_base).digest()
print(digest)

#T┼ǃ×ÞRK(M<¶┤#  ²

如何获得与Python 2.7结果相同的字符串? .hexdigest也不是这种情况。

1 个答案:

答案 0 :(得分:3)

您得到的结果完全相同,即一个字节串。唯一的区别是,在Python 3中,打印字节串可为您提供调试友好的表示形式,而不是原始字节。这是因为原始字节不一定可打印,并且print()需要 Unicode字符串

如果必须具有相同的输出,则将字节直接写到stdout缓冲区中,绕过Unicode TextIOWrapper(),后者负责将文本编码为基础语言环境编解码器:

import sys

digest = md5(encryption_base.encode('ASCII')).digest()
sys.stdout.buffer.write(digest + b'\n')

请注意,您还必须确保将encryption_base值也定义为bytes值,至少像我一样将其编码为相同的编解码器ASCII以上。

将其定义为字节串可为您提供与Python 2中相同的值,而无需编码:

encryption_base  = b'cS35jJYp15kjQf01FVqA7ubRaNOXKPmYGRbLUiimX0g3frQhzOZBmTSni4IEjHLWYMMioGaliIz5z8u2:abcdefghkmnopqrstuvwxyz:4'

在不显式设置参数的情况下使用str.encode()时,您正在编码为UTF-8。如果您的encryption_base字符串仅包含ASCII码点,则结果将相同,但如果其中也包含任何Latin-1或更高的码点,则结果将相同。不要将字节与Unicode代码点混淆!请参阅https://nedbatchelder.com/text/unipain.html,以充分了解差异以及该差异如何适用于Python 2和3。