[英]What's the fastest way to compare bits of a hash in Python3?
我正在寻找比较Hashcash系统一部分的Python3中的哈希值。 因此,例如,我想知道SHA256哈希的前N位是否为0。
现在,我正在根据十六进制版本执行此操作
if newhash.hexdigest()[0:4] == '0000'
但这并不能让我得到想要的详细信息-我更喜欢比较原始位,这使我可以更紧密地改变匹配0的数量。
我得到了要通过卷积跳进行比较的位值
bin(int(h.hexdigest(), 16))[2:]
但这似乎不可能是最快/正确的方法。
我会很感激任何关于正确/正确方法的建议;)
谢谢,
CPD
要检查一些选择的比特是零,你需要和使用具有所有这些设置位的预计算的面具的数量,比较的结果为零。 检查m
位数字的前n
位的掩码是由n
1s后跟二进制的m - n
0s组成的数字。
def mask(n, m):
return ((1 << n) - 1) << (m - n)
def test_0bits(digest_bytes, n_bits):
m = 8 * len(digest_bytes)
digest_num = int.from_bytes(digest_bytes, 'big')
return digest_num & mask(n_bits, m) == 0
>>> test_0bits(b'\123\456', 3) # 001 010 011 100 101 110
False
>>> test_0bits(b'\023\456', 3) # 000 010 011 100 101 110
True
如果您以相同的位数继续调用test_bits
,则可以预先计算掩码并将其存储为模块级“常量”。
您可以像这样解压缩摘要的前8个字节:
bin(struct.unpack('>Q', h.digest()[:8])[0])
但我不确定它是否更快,并且对于其余部分来说并不方便。 在Python中,位纠缠并不容易。
如果您可以从右边处理索引位,则gmpy2中的整数类型支持切片以访问各个位:
>>> x=gmpy2.mpz(12345)
>>> x.digits(2)
'11000000111001'
>>> x[2:5].digits(2)
'110'
如果您需要修改单个位,则gmpy2包括一种可变的整数类型,可让您修改到位。
免责声明:我维护gmpy2。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.