hash() 函数产生不一致的哈希值

ewi*_*ard 1 python hash json list blockchain

我有一个函数可以生成一个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(),
    }
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这个函数创建了一个与行中的下一个块完全不同的哈希(链上附加到前面块的最后一个块的哈希与前面块的哈希不匹配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

Mar*_*ers 5

hash()只适用于生产映射,哈希表。它使用随机种子来防止攻击。它不是加密散列,不应指望在 Python 调用中保持稳定。

hash()功能文档:

返回对象的哈希值(如果有)。哈希值是整数。它们用于在字典查找期间快速比较字典键。比较相等的数值具有相同的哈希值(即使它们的类型不同,如 1 和 1.0 的情况)。

来自__hash__hook 方法hash()如果存在则调用:

注意:默认情况下,该__hash__()strbytes并且datetime对象是“咸”不可预测的随机值。尽管它们在单个 Python 进程中保持不变,但它们在 Python 的重复调用之间是不可预测的。

坚持hashlib模块选项;这些在通话中都是稳定的。

除此之外,单个 Python 进程中,hash()在具有相同value 的对象上,也将产生完全相同的哈希。由于您的block字典在块之间发生变化(因为它包括链中前一个块的散列),它自然不会是相同的字符串,因此不会是相同的散列值。

这同样适用于hashlib功能;它们只为相同的输入产生相同的值。如果您的哈希值不同,则输入不同。您的输入自然不同,因为每个block字典都包含对前面哈希的引用。