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

时间:2018-01-07 16:49:12

标签: python json list hash 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(),
    }

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的问题

2 个答案:

答案 0 :(得分:3)

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

来自hash() function文档:

  

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

以及__hash__ hook method,其中hash()调用如果存在:

  

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

坚持hashlib module选项;这些都是稳定的。

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

这同样适用于hashlib功能;它们仅为相同的输入生成相同的值。如果您的哈希值不同,则输入会有所不同。并且您的输入自然不同,因为每个block字典都包含对前一个哈希的引用。

答案 1 :(得分:0)

打印出json.dumps后的对象后,我注意到它保留了添加的hash属性(我认为它不是) - 检查变量