hash() 函数产生不一致的散列
hash() function producing inconsistent hashes
我有一个生成 block
的函数,其中包含一些数据:
def new_block(self, proof, previous_hash=None):
...
block = {
'message': 'New Block Forged',
'index': len(self.chain) + 1,
'transactions': self.current_transactions,
'proof': proof,
'previous_hash': previous_hash, or self.hash_block(self.chain[-1]),
'timestamp': response.tx_time or time(),
}
self.chain
是方块所在的方块列表。 previous_hash
(前一个块的哈希)被传递给函数,并创建一个时间戳。不要太担心实际数据的细节(好吧,那里可能有问题,但它更多地与 hash()
函数相关,而不是与数据发生的事情有关)
接下来我对块进行哈希处理,并将其添加到块中:
block['hash'] = self.hash_block(block)
hash_block
函数如下所示:
@staticmethod
def hash_block(block):
block_string = json.dumps(block, sort_keys=True)
return hash(block_string)
这个函数创建了一个完全不同于行中的下一个块的哈希值(最后一个块的哈希值附加到前面的块,在链上,与 previous_hash
不匹配挡在前面。但是,他们使用的是相同的功能:
这一行:
'previous_hash': previous_hash or self.hash_block(self.chain[-1])
和这一行:
block['hash'] = self.hash_block(block)
是重要的行(和hash_block
)函数。一个块被创建,被散列并附加散列,然后另一个块被创建并对前一个块进行散列,但它与创建块时为该块创建的散列不匹配。
此外,我从 hashlib.sha256 开始,当我注意到这个问题时,我决定看看它是否是散列函数,所以我切换到 stock
散列,但我仍然有问题 - 最终我希望它能在 hashlib
上工作,但我想如果我能先让它在 hash
上工作......我会解决 hashlib
[=26 的问题=]
hash()
是只适合生产映射,哈希表。它使用 随机种子 来防止攻击。它 不是 加密哈希,不应指望它在 Python 次调用中保持稳定。
来自 hash()
function 文档:
Return the hash value of the object (if it has one). Hash values are integers. They are used to quickly compare dictionary keys during a dictionary lookup. Numeric values that compare equal have the same hash value (even if they are of different types, as is the case for 1 and 1.0).
并且来自 __hash__
hook method,hash()
如果存在则调用:
Note: By default, the __hash__()
values of str
, bytes
and datetime
objects are “salted” with an unpredictable random value. Although they remain constant within an individual Python process, they are not predictable between repeated invocations of Python.
坚持hashlib
module选项;这些在通话中是稳定的。
除此之外,在单个Python进程中,hash()
在具有相同值的对象上, 也会产生完全相同的散列。由于您的 block
字典在块之间发生变化(因为它包括链中前一个块的哈希值),它自然会 not 是相同的字符串,因此不是相同的哈希值值。
同样适用于hashlib
函数;它们仅对相同的输入产生相同的值。如果您的哈希值不同,则输入不同。您的输入自然会有所不同,因为每个 block
字典都包含对前面哈希的引用。
打印完 json.dumps
的对象后,我注意到它保留了添加的 hash
属性(我以为不是)- 检查你的变量
我有一个生成 block
的函数,其中包含一些数据:
def new_block(self, proof, previous_hash=None):
...
block = {
'message': 'New Block Forged',
'index': len(self.chain) + 1,
'transactions': self.current_transactions,
'proof': proof,
'previous_hash': previous_hash, or self.hash_block(self.chain[-1]),
'timestamp': response.tx_time or time(),
}
self.chain
是方块所在的方块列表。 previous_hash
(前一个块的哈希)被传递给函数,并创建一个时间戳。不要太担心实际数据的细节(好吧,那里可能有问题,但它更多地与 hash()
函数相关,而不是与数据发生的事情有关)
接下来我对块进行哈希处理,并将其添加到块中:
block['hash'] = self.hash_block(block)
hash_block
函数如下所示:
@staticmethod
def hash_block(block):
block_string = json.dumps(block, sort_keys=True)
return hash(block_string)
这个函数创建了一个完全不同于行中的下一个块的哈希值(最后一个块的哈希值附加到前面的块,在链上,与 previous_hash
不匹配挡在前面。但是,他们使用的是相同的功能:
这一行:
'previous_hash': previous_hash or self.hash_block(self.chain[-1])
和这一行:
block['hash'] = self.hash_block(block)
是重要的行(和hash_block
)函数。一个块被创建,被散列并附加散列,然后另一个块被创建并对前一个块进行散列,但它与创建块时为该块创建的散列不匹配。
此外,我从 hashlib.sha256 开始,当我注意到这个问题时,我决定看看它是否是散列函数,所以我切换到 stock
散列,但我仍然有问题 - 最终我希望它能在 hashlib
上工作,但我想如果我能先让它在 hash
上工作......我会解决 hashlib
[=26 的问题=]
hash()
是只适合生产映射,哈希表。它使用 随机种子 来防止攻击。它 不是 加密哈希,不应指望它在 Python 次调用中保持稳定。
来自 hash()
function 文档:
Return the hash value of the object (if it has one). Hash values are integers. They are used to quickly compare dictionary keys during a dictionary lookup. Numeric values that compare equal have the same hash value (even if they are of different types, as is the case for 1 and 1.0).
并且来自 __hash__
hook method,hash()
如果存在则调用:
Note: By default, the
__hash__()
values ofstr
,bytes
anddatetime
objects are “salted” with an unpredictable random value. Although they remain constant within an individual Python process, they are not predictable between repeated invocations of Python.
坚持hashlib
module选项;这些在通话中是稳定的。
除此之外,在单个Python进程中,hash()
在具有相同值的对象上, 也会产生完全相同的散列。由于您的 block
字典在块之间发生变化(因为它包括链中前一个块的哈希值),它自然会 not 是相同的字符串,因此不是相同的哈希值值。
同样适用于hashlib
函数;它们仅对相同的输入产生相同的值。如果您的哈希值不同,则输入不同。您的输入自然会有所不同,因为每个 block
字典都包含对前面哈希的引用。
打印完 json.dumps
的对象后,我注意到它保留了添加的 hash
属性(我以为不是)- 检查你的变量