Python - hash()和dict

时间:2016-01-05 06:15:56

标签: python dictionary hash

如果我们有2个单独的dict,两者都有相同的keysvalues,那么当我们打印它们时,它会按照预期的顺序排列。 所以,假设我想在hash()上使用dict

hash(frozenset(dict1.items()))
hash(frozenset(dict2.items()))

我这样做是为了创建一个新的dict,并将hash()值创建为新密钥。
即使在打印dict时显示不同,hash()创建的值总是相等的?如果不是,如何使它始终相同,以便我可以成功进行比较?

1 个答案:

答案 0 :(得分:4)

如果键和值hash相同,frozenset被设计为基础值的稳定且唯一的表示。 The docs explicitly state

  

当且仅当每一组中的每个元素都包含在另一组中时,两组相等(每一组都是另一组的子集)。

the rules for hashable types require that

  

比较相等的Hashable对象必须具有相同的哈希值。

因此,根据定义frozenset s具有相等的,可散列元素是相等的并且散列到相同的值。只有在生成的frozenset中包含不遵守哈希和相等规则的用户定义的类时,才会违反这一点。(但之后您遇到了更大的问题)。

请注意,这并不意味着他们会以相同的顺序迭代或产生相同的repr;由于链接哈希冲突,从不同顺序的相同元素构造的两个frozenset不需要以相同的顺序迭代。但它们仍然彼此相等,并且相同(精确的输出和排序依赖于实现,可能很容易在不同版本的Python之间变化;这恰好适用于我的Py 3.5安装以创建所需的&# 34;不同的迭代顺序"行为):

>>> frozenset([1,9])
frozenset({1, 9})
>>> frozenset([9,1])
frozenset({9, 1}) # <-- Different order; consequence of 8 buckets colliding for 1 and 9
>>> hash(frozenset([1,9]))
-7625378979602737914
>>> hash(frozenset([9,1]))
-7625378979602737914 # <-- Still the same hash though
>>> frozenset([1,9]) == frozenset([9,1])
True # <-- And still equal