当前位置: 首页 > 面试题库 >

python中默认的__hash__是什么?

东方琪
2023-03-14
问题内容

我经常使用时髦的东西作为字典的键,因此,我想知道什么是正确的方法-这是通过为对象实现良好的哈希方法实现的。我知道这里提出的其他问题[是实现
hash的好方法,但我想了解默认值如何__hash__用于自定义对象,以及是否有可能依赖它。

我注意到可变项显然是不可哈希的,因为hash({})会引发错误……但是奇怪的是,自定义类是可哈希的:

>>> class Object(object): pass
>>> o = Object()
>>> hash(o)

那么,有人知道此默认哈希函数如何工作吗?通过了解这一点,我想知道:

如果我放置与字典键相同类型的对象,是否可以依赖此默认哈希值?例如:

key1 = MyObject()
key2 = MyObject()
key3 = MyObject()
{key1: 1, key2: 'blabla', key3: 456}

如果我将不同类型的对象用作字典的键,可以依赖它吗?例如

{int: 123, MyObject(10): 'bla', 'plo': 890}

在最后一种情况下,如何确保我的自定义哈希不与内置哈希冲突?例如:

{int: 123, MyObject(10): 'bla', MyObjectWithCustomHash(123): 890}

问题答案:

您可以依靠的是:自定义对象具有默认值hash(),该默认值在某种程度上基于对象的身份。也就是说,使用默认哈希的任何对象在其生命周期内将具有该哈希的恒定值,并且不同的对象可能具有也可能没有不同的哈希值。

您不能依赖所返回id()的值和所返回的值之间的任何特定关系hash()。在Python 2.6和更低版本的标准C实现中,它们在Python
2.7-3.2中是相同的hash(x)==id(x)/16

编辑: 最初我写道,在3.2.3和更高版本或2.7.3或更高版本中,哈希值可能是随机的,而在Python
3.3中,关系始终是随机的。实际上,目前随机化仅适用于散列字符串,因此,事实上16分频的关系可能会暂时保持下去,但不要依靠它。

哈希冲突通常并不重要:在字典查找中查找对象时,哈希必须具有相同的哈希,并且必须比较相等。只有当您遇到很大比例的冲突(例如,由于拒绝服务攻击而导致最近版本的Python能够随机化哈希计算)时,冲突才有意义。



 类似资料:
  • 问题内容: 从python文档docs.python.org/tutorial/introduction.html#strings: 切片索引具有有用的默认值。省略的第一索引默认为零,省略的第二索引默认为要切片的字符串的大小。 对于标准情况,这很有意义: 到现在为止还挺好。但是,使用负值阶跃值似乎表明默认值略有不同: 很好,如果步长为负,则默认为反向。省略的第一索引默认为要切片的字符串的大小,省略

  • 我正在使用JAXP XSLT API(javax.xml.transform)来转换xml文件。 TransformerFactory的javadoc表示:它使用以下有序查找过程来确定要加载的TransformerFactory实现类: 使用javax。xml。使改变TransformerFactory系统属性 使用JRE目录中的属性文件“lib/jaxp.properties”。此配置文件采用标

  • 本文向大家介绍浅谈python中的变量默认是什么类型,包括了浅谈python中的变量默认是什么类型的使用技巧和注意事项,需要的朋友参考一下 1、type(变量名),输出的结果就是变量的类型; 例如 >>> type(6) <type 'int'> 2、在Python里面变量在声明时,不需要指定变量的类型,变量的类型是动态指定的;>>> x=5 >>> type(x) <type 'int'> >>

  • 问题内容: 如果我创建一个新的Date()对象。它将打印的默认时区是什么。 我的机器在GMT中运行。我正在创建一个新的Date()对象。如果我打印为什么它显示周四7月5日8时21分05秒 PKT 2012年它是如何花费的时区为PKT? 问题答案: 日期本身没有任何时区。它的方法使用当前的默认时区返回表示该日期的字符串: 在我的机器上执行上述代码会导致以下输出:

  • Kubernetes的pods(部署)活跃性和就绪性问题可以用这个初始延迟来配置----这意味着问题将在容器启动后的这多次发送之后开始。如果没有指定,默认值是多少?我好像找不到了。periodSeconds的默认值记录为10秒。 谢谢

  • 问题内容: 档案:SafeString.js 我从未见过。是否有任何等效的东西更容易理解? 问题答案: 它是ES6模块系统的一部分,该文档中还有一个有用的示例: 如果模块定义了默认导出: 那么您可以通过省略花括号来导入默认导出: 更新: 自2015年6月,该模块系统中定义§15.2和在特定语法中定义§15.2.3ECMAScript的2015规范的。