我很难在Python3.6中获得与Python2.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'T\xc5\x80\x9f\x9e\xe8RK(M<\xf4\xb4#\t\xfd'
我怎样才能得到与Python2.7结果相同的字符串呢?.hexdigest也不是这样的。
发布于 2018-08-05 06:38:05
您将得到完全相同的结果,即一个字节字符串。惟一的区别是,在Python3中,打印一个字节字符串会给出一个调试友好的表示,而不是原始的字节。这是因为原始字节不一定是可打印的,而print()
需要Unicode字符串。
如果您必须具有相同的输出,请绕过负责将文本编码到基础区域设置编解码器的Unicode TextIOWrapper()
,将字节直接写入stdout
缓冲区:
import sys
digest = md5(encryption_base.encode('ASCII')).digest()
sys.stdout.buffer.write(digest + b'\n')
请注意,您必须确保也将ASCII值定义为ASCII值,或者至少像我上面所做的那样,将其编码为相同的编解码器encryption_base
。
将其定义为bytestring将为您提供与Python 2中相同的值,而无需编码:
encryption_base = b'cS35jJYp15kjQf01FVqA7ubRaNOXKPmYGRbLUiimX0g3frQhzOZBmTSni4IEjHLWYMMioGaliIz5z8u2:abcdefghkmnopqrstuvwxyz:4'
当您在没有显式设置参数的情况下使用str.encode()
时,您将编码为UTF-8。如果您的encryption_base
字符串只包含ASCII代码点,则结果将是相同的,但如果其中也包含任何拉丁文-1或更高的代码点,则结果将不同。不要将字节与Unicode代码点混淆!请参阅https://nedbatchelder.com/text/unipain.html以完全了解其中的差异以及这种差异如何应用于Python2和3。
https://stackoverflow.com/questions/51690019
复制相似问题