Python 3.6相当于md5 digest()方法



我很难在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。

最新更新