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 methodhash() 如果存在则调用:

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 属性(我以为不是)- 检查你的变量