Python3 Crypto.Hash - SHA摘要始终以二进制1开头

问题描述 投票:2回答:1

我正在开发一个项目,我正在尝试创建一个非常简单的基于区块链的加密货币。这是我尝试散列块对象的方式的过度简化版本(显然Block类的字段要复杂得多,但这是主要的想法):

from Crypto.Hash import SHA
import json
from collections import OrderedDict
from random import random

class Block(object):

    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def to_dict(self):
        d = OrderedDict({
            'x' : self.x,
            'y' : self.y,
            'z' : self.z
        })
        return d

    def json(self):
        return json.dumps(self.to_dict())

    def hash(self):
        return SHA.new(self.json().encode('utf8')).hexdigest()

# driver code to test hashing
while True:
    x, y, z = [random() for _ in range(3)]
    b = Block(x, y, z)
    if not bin(int(b.hash(), 16)).startswith('0b1'):
        break

上面的驱动程序永远循环。问题在于(无论字段的数量和/或值如何)哈希总是从0b1开始,这与挖掘难度和工作量证明的整个想法混淆。但更重要的是,这不是散列函数的预期行为。我错过了什么?

python python-3.x hash pycrypto
1个回答
1
投票

默认情况下,Python不会将二进制数字的前面置零,因此任何二进制数的第一个数字将为1。

>>> bin(1)
'0b1'
>>> bin(2)
'0b10'
>>> bin(3)
'0b11'
>>> bin(8)
'0b1000'

如果要使用二进制字符串修复,请使用字符串格式

>>> "{:04b}".format(1)
'0001'
>>> "{:04b}".format(2)
'0010'
>>> "{:04b}".format(8)
'1000'
>>> "{:04b}".format(15)
'1111'

否则,只需使用二进制和(&)来检查特定位是否已设置。

>>> bool(1 & 0b1000)
False
>>> bool(3 & 0b1000)
False
>>> bool(8 & 0b1000)
True
>>> bool(15 & 0b1000)
True
© www.soinside.com 2019 - 2024. All rights reserved.