【问题标题】:hashlib.md5 python2 vs python3 (string vs bytes)hashlib.md5 python2 vs python3(字符串 vs 字节)
【发布时间】:2020-05-27 21:21:36
【问题描述】:

我在 python2 和 python3 中都使用 hashlib.md5 生成哈希。 python2 输出字符串,而 python3 输出字节。 我必须对 python3 中的字符串使用“latin1”编码来匹配默认的 python2 编码。

我想确保 python3 输出与 python2 相同的结果并使用字符串进行进一步处理。

问题:如何保证/转换md5输出字符串?

原因是我的 python2 是有效输出,我正在将脚本从 py2 迁移到 py3,所以想验证输出,但目前我无法将字节与字符串进行比较。

python2:

import hashlib


s = "fred"
hashlib.md5("fred").digest()

输出:'W\n\x90\xbf\xbf\x8c~\xab]\xc5\xd4\xe2h2\xd5\xb1'

python3:

import hashlib


s = "fred"
hashlib.md5("fred".encode("latin1")).digest()

输出:b'W\n\x90\xbf\xbf\x8c~\xab]\xc5\xd4\xe2h2\xd5\xb1'

【问题讨论】:

  • 嘿!我不太明白你的问题......你想总是将输出转换为字符串吗?然后只需使用内置的str 函数......或者你到底在问什么?我认为这需要编辑
  • 在 python3 中:str(hashlib.md5("fred".encode("latin1")).digest())[2:-1] 与在 python2 中不同:hashlib.md5(" fred").digest() 作为额外的 \ 被添加

标签: python string byte md5 hashlib


【解决方案1】:

您可以通过使用md5.hexdigest() 来解决这个问题,这将在 Python 2 和 Python 3 中返回一个字符串。


from hashlib import md5

hash_ = md5()
hash_.update(b"test")
print(hash_.hexdigest())

Python 3 结果:

'098f6bcd4621d373cade4e832627b4f6'

Python 2 结果:

'098f6bcd4621d373cade4e832627b4f6'

【讨论】:

  • 原始 python2 代码使用 digest() 并对返回的字符串进行一些字符替换。
  • 所以你不能用hexdigest()替换digest()
  • 如果我使用 hexdigest 则返回完全不同的字符串
  • 由于逻辑原因,我无法用 hexdigest() 替换 digest()
  • 为什么不去掉后处理逻辑呢?如果您为两个版本的 Python 输入相同的字符串,hexdigest() 将为两个版本的 Python 返回完全相同的哈希值。
猜你喜欢
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2011-07-02
  • 2021-02-09
相关资源
最近更新 更多