繁体   English   中英

在Python3中比较哈希位的最快方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM