Python 3.6 等效于 md5 digest() 方法?

Python 3.6 equivalent of md5 digest() method?

我在 Python 2.7 和 Python 3.6.

中无法获得与 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'

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

你有完全相同的结果,一个字节串。唯一的区别是在 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。