如何使用Hashlib对MD5进行数字哈希处理?

时间:2019-10-03 04:59:37

标签: python md5 hashlib

似乎每个人都在这样做:

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)

无效,并且我尝试了许多其他变体。正确的语法是什么?

2 个答案:

答案 0 :(得分:2)

散列操作按 bytes 字节的顺序进行。

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)

执行此操作的正确方法完全取决于您要实现的目标,而您尚未告诉我们。

答案 1 :(得分:0)

至少可以说,哈希数的模棱两可。
该数字在送入摘要算法之前应转换为字节。您将遇到的第一个问题是该数字占用多少字节大小,可能是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()

希望有帮助。