【问题标题】:How to use Hashlib to MD5 hash a number?如何使用 Hashlib 对一个数字进行 MD5 散列?
【发布时间】:2019-10-03 04:59:37
【问题描述】:

似乎每个人都在这样做:

import hashlib 

# initializing string 
str = "GeeksforGeeks"

# encoding GeeksforGeeks using encode() 
# then sending to md5() 
result = hashlib.md5(str.encode()) 

但是,我想对普通数字进行哈希处理。像

result = hashlib.md5(0) 
#or
var = 5
result = hashlib.md5(var)

不起作用,我尝试了许多其他变体。什么是正确的语法?

【问题讨论】:

  • 不工作如何?你遇到了什么错误?
  • str(num).encode()?

标签: python md5 hashlib


【解决方案1】:

散列对字节序列进行操作。

Python 中的整数只是一个逻辑值;它没有明确的大小或字节表示。如果你想对数字进行散列,你需要在散列之前决定将数字放入什么形式。

最简单的选择是散列数字的字符串表示。通过调用str 并对结果进行散列处理来做到这一点。例如

var = 5
hash_input = str(var)
result = hashlib.md5(hash_input)

另一种选择是选择固定大小,并对数字的二进制表示进行哈希处理:

var = 5
hash_input = struct.pack('<I', var)  # Little-endian 32-bit unsigned
result = hashlib.md5(hash_input)

执行此操作的正确方法完全取决于您到底想要完成什么,而您没有告诉我们。

【讨论】:

  • 我正在尝试对特定值进行哈希处理。比如我希望5是5的字节值(0101)
  • 如果您提供一个大于 255 或小于零的数字怎么办?
  • 为什么会有问题?
  • 假设您要散列5。这意味着您可以对字节进行散列处理:05,或05 00(uint16 LE),或05 00 00 00(uint32 LE),或00 05(uint16 BE),或00 00 00 05(uint32 BE)。您需要决定要散列的数据的二进制格式。那么告诉我,如果您想对值 123456 进行哈希处理,您将提供给哈希的字节字符串是什么?
  • 我想尝试所有这些以找到我想要的东西(强力反向搜索)。如何指定 00、00 00、00 00 00、01.... 等?
【解决方案2】:

至少可以说,散列普通数字是模棱两可的。
在输入摘要算法之前,该数字应转换为字节。您将遇到的第一个问题是数字占用多少字节大小,可以是 4 字节、8 字节或其他。然后是字节顺序,即内存中字节的顺序。所有这些都会导致看似相同的数字产生不同的摘要。 (为简单起见,我假设数字是 int)

>>> hashlib.md5(b'4').hexdigest()
'a87ff679a2f3e71d9181a67b7542122c'
>>> i = 4
>>> hashlib.md5(i.to_bytes(2, 'big')).hexdigest()
'c244b9cdf7853b5693a295e384c07367'
>>> hashlib.md5(i.to_bytes(4, 'big')).hexdigest()
'ea4959eb64a1f09be580d950964f3843'
>>> hashlib.md5(i.to_bytes(8, 'big')).hexdigest()
'59cff542fae7e0c4267e45740a12c9a0'

因此,您的解决方案是将int 转换为str 并对其进行编码,以便从中获取摘要。

# either this
>>> hashlib.md5(b'4').hexdigest()
# or
>>> hashlib.md5(str(4).encode()).hexdigest()

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2018-06-30
    • 2021-02-04
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多