【问题标题】:Varying length of MD5 checksum in pythonpython中不同长度的MD5校验和
【发布时间】:2018-03-21 08:09:05
【问题描述】:

我使用以下代码来计算 MD5 哈希码的二进制表示。

MD5 总是 128 字节,bin 返回一个以“0b”开头的字符串。因此,md5_bin 的长度必须始终为 130,但是当我运行程序时,它在 random_str 的不同值上在 128 和 130 之间变化。

md5_bin = bin(int(hashlib.md5(random_str).hexdigest(),16))`
print len(md5_bin)

【问题讨论】:

  • bin 不会添加前导0s...(它怎么知道要添加多少?)。 len(hashlib.md5(random_bytes).hexdigest()) 永远是 32。

标签: python binary md5 hashlib


【解决方案1】:

当然,MD5 总是 128 字节,但有时第一个字节是 0,有时第二个字节也是。

这样想:十进制字符串'15' 和十进制'0015' 都是同一个数字15。当您要求 Python 将 int 15 转换为字符串时,您将得到 '15',而不是 '0015'。它无法知道您想要 4 位数而不是 2:

>>> n = int('0015')
>>> str(n)
'15'

bin 也是如此。它无法知道你想要 128 位而不是 126。你给它一个 126 位的数字,所以它给你 126 个二进制数字。

但是你可以告诉它你想要那个,例如,format spec:

bits = format(md5_bin, '0128b')

……或者,等效地:

bits = '{:0128b}'.format(md5_bin)

如果你想要0b 前缀,你可以添加:

bits = format(md5_bin, '#0128b')
bits = '{md5_bin:#0128b}'.format(md5_bin)
bits = '0b{md5_bin:0128b}'.format(md5_bin)

【讨论】:

  • 很好的答案!但是问题是用python 2编写的。您可能会将OP与格式字符串混淆...
  • @hiroprotagonist 你说得对;将其更改为使用str.format。 (并更新了 Python 2 版本的文档链接。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多