【问题标题】:Python 3.6 equivalent of md5 digest() method?Python 3.6 相当于 md5 digest() 方法?
【发布时间】:2018-08-04 22:32:39
【问题描述】:

我无法在 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'T\xc5\x80\x9f\x9e\xe8RK(M<\xf4\xb4#\t\xfd'

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

【问题讨论】:

  • Hexdigest 在 Python 2 和 3 上给出完全相同的输出,为什么你认为它不是?对于这两个脚本都是 54c5809f9ee8524b284d3cf4b42309fd.

标签: python python-3.x python-2.7 md5 cryptographic-hash-function


【解决方案1】:

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

【讨论】:

  • 发生我需要在结果字符串的每个字符中调用 ord() 。在 python 2.7 中,ord 调用完美,但在 3.6 中我得到错误:TypeError: ord() expected string of length 1, but int found
  • 为什么需要拨打ord()?如果你只想要整数值,那么在 Python 3 中你已经有了整数,因为bytes 对象实际上是整数的可迭代对象。
  • 所以 digest[0] 在 Python 3 中是整数 84,而在 Python 2 中你必须使用 ord() 来获得相同的整数。
  • 天哪,我没注意到。非常感谢Martijin的启蒙。另外,您在那里提供的链接很棒。
猜你喜欢
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多