gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:28:53 25 4
gpt4 key购买 nike

我正在寻找一个返回 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'
这不可能是正确的,因为它们都是从两个开始的。

最佳答案

下面我提供了四种获取 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

关于返回 32(或 64)位的 python 哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67219691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com