我无法在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也不是这种情况。
答案 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。