gpt4 book ai didi

Python3 Crypto.Hash - SHA 摘要总是以二进制 1 开头

转载 作者:太空宇宙 更新时间:2023-11-04 04:17:03 25 4
gpt4 key购买 nike

我正在开展一个项目,试图创建一种非常简单的基于区 block 链的加密货币。这是我尝试对 block 对象进行哈希处理的方式的过度简化版本(显然 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 不会在二进制数的前面补零,因此任何二进制数的第一位都是 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

关于Python3 Crypto.Hash - SHA 摘要总是以二进制 1 开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55213217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com