提取MD5哈希的前8个字节

-2 投票
3 回答
5248 浏览
提问于 2025-04-18 14:52

我正在尝试把一个字符串转换成一个哈希值,我已经用hashlib库实现了这一点,代码如下:

def get_md5_as_bytes(data):
    m = hashlib.md5()
    m.update(data)
    return m.digest()

接下来,我需要从这个结果中提取前8个字节,然后用它做其他事情。

在之前的一个问题中,有人建议我使用Struct来把一个8字节的十六进制数转换成十进制。现在我再次查看这个方法,觉得它可能正好能解决我的问题。请问,能否使用Struct从一个字节字符串中提取前8个字节呢?

3 个回答

1

如果有人想要获取一个64位整数:

def hash_int64(input_string):
    m = hashlib.md5()
    m.update(input_string)
    bytes_64 = m.digest()[:8]
    return struct.unpack('>q', bytes_64)[0]

这个内容是基于 mu 無 的回答

1

如果你使用了 mu 無 的方法,配合 m.hexdigest()[:8],那么你可以把它转换成字节列表:

hex_str = get_md5_as_bytes('hello world')

print 'string:', hex_str

bytes = [ int(x, 16) for x in hex_str ]

print 'bytes:', bytes

结果是

string: 5eb63bbb
bytes: [5, 14, 11, 6, 3, 11, 11, 11]

编辑:

使用

import struct

print 'unpack:', struct.unpack('8B', hex_str)

你可以得到 hex_str 中字符的 ASCII 码 - 不过我觉得这可能不是你想要的结果。

string: 5eb63bbb
unpack: (53, 101, 98, 54, 51, 98, 98, 98)

但是也许如果你用 m.digest(),你就能得到你想要的结果。

3

试试下面这个方法——基本上是在返回的字符串后面加上 [:8] 来截取。

def get_md5_as_bytes(data):
    m = hashlib.md5()
    m.update(data)
    return m.hexdigest()[:8]

注意,我使用了 hexdigest,而不是 digest。如果需要的话,你可以换回来。

撰写回答