返回32(或64)位的python哈希函数

2024-09-30 20:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个返回32(或64)位的哈希函数。我尝试了hashlib中的md5。例如:

import hashlib
hashlib.md5(b"H").hexdigest()

给予

c1d9f50f86825a1a2302ec2449c17196

如果没有这样的散列函数,是否可以从散列中提取前导32位?我试过:

st = hashlib.md5(b"H").hexdigest()
' '.join(format(x, 'b') for x in bytearray(st, 'utf-8'))

要将哈希转换为二进制,但它会提供:

'1100011 110001 1100100 111001 1100110 110101 110000 1100110 111000 110110 111000 110010 110101 1100001 110001 1100001 110010 110011 110000 110010 1100101 1100011 110010 110100 110100 111001 1100011 110001 110111 110001 111001 110110'

这不可能是正确的,因为他们都是从两个一开始的


Tags: 函数inimportformatfor二进制md5utf
1条回答
网友
1楼 · 发布于 2024-09-30 20:29:16

下面,我提供了四种获取32/64位哈希值的解决方案,如整数、字节、十六进制、位(二进制字符串)

作为十进制整数(大端):

Try it online!

import hashlib
print(int.from_bytes(hashlib.sha256(b"H").digest()[:4], 'little')) # 32-bit int
print(int.from_bytes(hashlib.sha256(b"H").digest()[:8], 'little')) # 64-bit int

输出:

3866803524
12578350417885969732

不使用整数,只需按小尾数顺序获取字节,请执行以下操作:

Try it online!

import hashlib
print(hashlib.sha256(b"H").digest()[:4]) # 32-bit, 4 bytes
print(hashlib.sha256(b"H").digest()[:8]) # 64-bit, 8 bytes

输出:

b'D\xbdz\xe6'
b'D\xbdz\xe6\x0fG\x8f\xae'

也可以获取32/64位十六进制值。第一个变量为小端十六进制字节:

Try it online!

import hashlib
print(hashlib.sha256(b"H").hexdigest()[:8 ]) # 32-bit, 8  hex chars
print(hashlib.sha256(b"H").hexdigest()[:16]) # 64-bit, 16 hex chars

输出:

44bd7ae6
44bd7ae60f478fae

第二个变量为十六进制数(大端):

Try it online!

import hashlib
print(hex(int.from_bytes(hashlib.sha256(b"H").digest()[:4], 'little'))) # 32-bit int
print(hex(int.from_bytes(hashlib.sha256(b"H").digest()[:8], 'little'))) # 64-bit int

输出:

0xe67abd44
0xae8f470fe67abd44

如果需要,您甚至可以获取位(二进制字符串)。这里的位正好是32和64,并以大端顺序表示

Try it online!

import hashlib
print(bin(int.from_bytes(hashlib.sha256(b"H").digest(), 'little'))[-32:]) # 32-bit
print(bin(int.from_bytes(hashlib.sha256(b"H").digest(), 'little'))[-64:]) # 64-bit

输出:

11100110011110101011110101000100
1010111010001111010001110000111111100110011110101011110101000100

如果要计算二进制表示中前导零的数量,则可以执行以下操作:

Try it online!

s = '000010110100101100'
print(next(i for i, e in enumerate(s + '1') if e == '1'))

输出:

4

不要忘记,上面的哈希的二进制表示是按大端顺序计算的,这意味着最重要的位位于最左边。如果需要计算最低有效位一侧的零位计数,则首先反转字符串,如下所示:

Try it online!

s = '000010110100101100'
print(s[::-1])

输出:

001101001011010000

相关问题 更多 >