0

Hashcash システムの一部として、Python3 でハッシュのビットを比較しようとしています。たとえば、SHA256 ハッシュの最初の N ビットが 0 かどうかを知りたいとします。

現在、16進バージョンに基づいてこれを行っています

  if newhash.hexdigest()[0:4] == '0000'

しかし、これは私が望むほど細かくすることはできません - 私は生のビットを比較したいと思います。これにより、一致する 0 の数をより厳密に変えることができます。

複雑なホップを介して比較するビット値を取得します

  bin(int(h.hexdigest(), 16))[2:]

しかし、これはおそらく最速/正しい方法ではないようです。

正しい/正しい方法についてアドバイスをいただければ幸いです;)

ありがとう、

-CPD

4

3 に答える 3

1

数値の選択されたビットがゼロであるかどうかを確認するには、それらのすべてのビットが設定されている事前計算されたマスクを使用して数値を計算し、結果をゼロと比較する必要があります。ビット数の最初のビットをチェックするマスクは、2 進数で 1 の後に 0 が続く数値です。nmnm - n

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、マスクを事前に計算して、モジュール レベルの「定数」として格納できます。

于 2013-03-26T19:35:27.707 に答える
0

右からインデックス ビットを処理できる場合、gmpy2の整数型は、個々のビットにアクセスするためのスライスをサポートします。

>>> x=gmpy2.mpz(12345)
>>> x.digits(2)
'11000000111001'
>>> x[2:5].digits(2)
'110'

個々のビットを変更する必要がある場合、gmpy2 には変更可能な整数型が含まれており、ビットをその場で変更できます。

免責事項: 私は gmpy2 を保守しています。

于 2013-03-26T16:11:05.697 に答える
0

次のように解凍されたダイジェストの最初の 8 バイトを取得できます。

bin(struct.unpack('>Q', h.digest()[:8])[0])

しかし、それがより速いかどうかはわかりません。残りの部分では便利ではありません。Python ではビット操作は簡単ではありません。

于 2013-03-26T16:07:28.757 に答える