下面我提供了四种获取 32/64 位哈希值的解决方案:整数、字节、十六进制、位(二进制字符串)。
作为十进制整数(大端):
在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EA4j10oryc@OTKktSizWgknrFGYlGpmYaSUoeSpp6KZnpqcUlGprRViaxOgrqOZklJTmp6pqaCsoKxka6SZklZJllgW6WmQnIrP//AQ
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
Output:
3866803524
12578350417885969732
不使用整数来获取小端顺序的字节,而是执行以下操作:
在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EA8rTK85INDI100hS8lDS1EvJTE8tLtHQjLYyidVUUFYwNtJNyizRUTBRSKosSS0mTqsFWKuZCUSrBUTr//8A
import hashlib
print(hashlib.sha256(b"H").digest()[:4]) # 32-bit, 4 bytes
print(hashlib.sha256(b"H").digest()[:8]) # 64-bit, 8 bytes
Output:
b'D\xbdz\xe6'
b'D\xbdz\xe6\x0fG\x8f\xae'
也可以获得 32/64 位十六进制值。第一个变体为小端十六进制字节:
在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EA8rTK85INDI100hS8lDS1MtIrUjJTE8tLtHQjLayUIjVVFBWMDbSTcos0VGwUFAASiskZyQWFRNthqEZ2AwzE4gZhmYIM/7/BwA
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
Output:
44bd7ae6
44bd7ae60f478fae
第二个变体为十六进制数字(大端):
在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EIyO1QgNI66UV5efGJ1WWpBZrQBXoFWckGpmaaSQpeShp6qVkpqcWl2hoRluZxOooqOdklpTkpKpramoqKCsYG@kmZZYoAI0h21ALDEPNTGCG/v8PAA
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
Output:
0xe67abd44
0xae8f470fe67abd44
如果需要,您甚至可以获得位(二进制字符串)。这里的位的计数正好是 32 和 64,并以大端顺序表示。
在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EIykzTwNI66UV5efGJ1WWpBZrQBXoFWckGpmaaSQpeShp6qVkpqcWl2ho6iio52SWlOSkqmtqRusaG1lZxWoqKCsYG@kmZZZQxUwzE6iZZiYgM///BwA
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
Output:
11100110011110101011110101000100
1010111010001111010001110000111111100110011110101011110101000100
如果你想计算二进制表示中前导零的数量,那么你可以这样做:
在线尝试一下! https://tio.run/##LYkxCoAwEAR7X7HdJWiRYJ3HWJx4hZeQnKCvj0FcBoZhy2NH1rX3hgQKYzHEwe9AU6mi5pRvc4I9V8gChihYr5PrZuwaZlAkD9nHldIXvvcX
s = '000010110100101100'
print(next(i for i, e in enumerate(s + '1') if e == '1'))
Output:
4
不要忘记上面哈希的二进制表示是按大端顺序计算的,这意味着最高有效位位于最左边。如果您需要计算最低有效位侧的零位计数,请首先反转字符串,如下所示:
在线尝试一下! https://tio.run/##K6gsycjPM/7/v1jBVkHdAAgMDQyBCEobqHMVFGXmlWgUR1tZ6RrGav7/DwA
s = '000010110100101100'
print(s[::-1])
Output:
001101001011010000