我很难在Python 3.6中从Python 2.7中获得与md5 digest((方法相同的结果。
Python 2.7:
import md5
encryption_base = 'cS35jJYp15kjQf01FVqA7ubRaNOXKPmYGRbLUiimX0g3frQhzOZBmTSni4IEjHLWYMMioGaliIz5z8u2:abcdefghkmnopqrstuvwxyz:4'
digest = md5.new (encryption_base).digest()
print(digest)
#T┼ǃ×ÞRK(M<¶┤# ²
Python 3.6:
from hashlib import md5
encryption_base = 'cS35jJYp15kjQf01FVqA7ubRaNOXKPmYGRbLUiimX0g3frQhzOZBmTSni4IEjHLWYMMioGaliIz5z8u2:abcdefghkmnopqrstuvwxyz:4'
digest = md5(encryption_base.encode()).digest()
print(digest)
#b'Txc5x80x9fx9exe8RK(M<xf4xb4#txfd'
如何获得与Python 2.7结果中相同的字符串。六进制摘要并非如此。
您得到了完全相同的结果,一个字节字符串。唯一的区别是,在Python3中,打印字节串可以为您提供调试友好的表示,而不是原始字节。这是因为原始字节不一定是可打印的,并且print()
需要Unicode字符串。
如果必须具有相同的输出,请将字节直接写入stdout
缓冲区,绕过负责将文本编码到底层语言环境编解码器的UnicodeTextIOWrapper()
:
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。