2013-03-26 5 views
0

Hashcash 시스템의 일부로 Python3에서 해시 비트를 비교하려고합니다. 그래서 예를 들면, 나는 육각 버전Python3에서 해시 비트를 비교하는 가장 빠른 방법은 무엇입니까?

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

에 따라이하고 있어요하는 SHA256 해시의 첫 번째 N 비트는 현재 0

을하는 경우 알고 싶어하지만하지 않습니다 내가 원하는만큼 세분화되게해라. 나는 원시 비트를 비교하는 것을 선호한다. 일치하는 0의 수를 훨씬 더 많이 바꿀 수있다.

나는 비트 값이 복잡한 홉

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

을 통해 비교 하시고 얻을 수 있지만, 아마도 그것을 할 수있는/빠른 올바른 방법이 될 수없는 것처럼이 보인다.

내가 할 수있는 권리/올바른 방법에 어떤 조언을 감사하겠습니다

)

감사합니다,

-CPD는

+0

일반적으로 비트 비교와 비교하여 앞에 오는 0을 세는 것 ([최상위 비트 세트 찾기] (http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious))을 최적화 할 수 있습니다. – jfs

답변

0

당신은 다이제스트의 첫 8 바이트는 다음과 같이 압축을 푼받을 수 있습니다 :

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

그러나이 방법이 더 빠르면 잘 모르겠다. 나머지 비트는 편리하지 않을 것이다. 파이썬에서는 비트 열풍이 쉽지 않습니다.

0

오른쪽에서 색인 비트를 처리 할 수있는 경우는, gmpy2에서 정수 유형이 개별 비트에 액세스 할 슬라이스를 지원 : 개별 비트를 수정해야하는 경우

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

을 gmpy2 허용 변경 가능한 정수형을 포함 당신은 그 자리에있는 비트를 수정해야합니다.

면책 조항 : gmpy2를 유지합니다.

1

숫자의 선택된 비트가 0인지 확인하려면 and 숫자가 미리 계산 된 마스크으로 설정되어 있고 그 결과가 0으로 비교되어야합니다. 첫 번째 n 비트가 m 비트 수인지 확인하는 마스크는 n 1 초 다음에 이진수가 m - n 초인 숫자입니다. 당신은 동일한 비트 수의 test_bits를 계속 전화하면

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 

, 당신은 마스크를 미리 계산하고, 모듈 수준 "상수"로 저장할 수 있습니다.