我可以安全地使用包含64位整数(long)的元组哈希作为python字典中的唯一键吗?

2024-04-25 07:38:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须在dict中存储具有两个属性(ida和idb)的对象。这两个属性都是64位正整数,我只能为ida和idb的唯一排列(顺序重要的组合)存储一个对象。例如:

obj1 = SomeClass(ida=5223372036854775807, idb=2)
obj2 = SomeClass(ida=2, idb=5223372036854775807)
obj3 = SomeClass(ida=5223372036854775807, idb=2)

由于对象本身是可变的,所以我使用元组的散列(ida,idb,)'作为键。在下面的例子中,考虑一下:

^{pr2}$

我在我的64位机器上测试了上面的示例,它工作正常。在

我有以下问题:

  • 如果两个大整数元组在元素或排序上有差异,它们是否可能计算相同的哈希值?在
  • 在32位平台上呢?在
  • 如果没有,是否有一种独立于平台的方法来保证上面的例子不管ida和idb的值如何都能工作?

Tags: 对象属性顺序平台dict例子元组ida
3条回答
In [33]: hash?

Return a hash value for the object. Two objects with the same value have the same hash value. The reverse is not necessarily true, but likely.

为什么不直接使用元组(ida,idb)作为键呢?在

^{pr2}$

就像伊格纳西奥说的,你可以有散列碰撞。你为什么不直接用元组本身呢?元组是不可变的,看起来你的ida和idb是(不可变的)整数。在

只有2**<;word size>;可能的哈希值,因此您必须运行128位版本的Python来存储所有(2**64)**2个可能的哈希值。是的,仍然有可能发生碰撞。如果需要存储唯一的对象,请使用set;只要以一种合理的方式定义__hash__()和{}。在

相关问题 更多 >