-1

我在 Python 3.6 中从 Python 2.7 中获得与 md5 digest() 方法相同的结果时遇到了麻烦。

蟒蛇 2.7:

import md5

encryption_base  = 'cS35jJYp15kjQf01FVqA7ubRaNOXKPmYGRbLUiimX0g3frQhzOZBmTSni4IEjHLWYMMioGaliIz5z8u2:abcdefghkmnopqrstuvwxyz:4'
digest = md5.new (encryption_base).digest()
print(digest)

#T┼ǃ×ÞRK(M<¶┤#  ²

蟒蛇 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 也不是这种情况。

4

1 回答 1

3

你有完全相同的结果,一个字节串。唯一的区别是在 Python 3 中打印一个字节串给你一个调试友好的表示,而不是原始字节。那是因为原始字节不一定是可打印的并且print()需要Unicode 字符串

如果您必须具有相同的输出,请将字节直接写入stdout缓冲区,绕过TextIOWrapper()负责将文本编码到底层语言环境编解码器的 Unicode:

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。

于 2018-08-04T22:38:05.440 回答