SERVICE PHONE

13988889999
hashgame hashgame
你的位置: 首页 > hashgame
HASH GAME - Online Skill Game什么是可哈希对象它的哈希值是怎么计算的?

发布时间:2025-12-11 03:58:27  点击量:

  hashgame,hashgames,hash game casino,hash game sign up,hash game download/BETHASH GAME [PermaLink: 363050.com] is the largest official cryptocurrency game. Fair and just, 1 second commission return, providing: hashgame,hash game download,BTC, ETH,TRC20,TRX

HASH GAME - Online Skill Game什么是可哈希对象它的哈希值是怎么计算的?

  通过研究字典的底层实现,我们找到了字典快速且高效的秘密,就是哈希表。而提到哈希表,必然绕不开哈希值,因为它决定了映射之后的索引。

  如果想计算对象的哈希值,那么要保证对象必须是可哈希的。如果不可哈希,那么它就无法计算哈希值,自然也就无法作为字典的 key。那什么样的对象是可哈希的呢?

  所以如果对象满足不可变、并且实现了 __eq__ 方法,那么它就是可哈希的,只有这样的对象才能作为字典的 key 或者集合的元素。

  像整数、浮点数、字符串等内置的不可变对象都是可哈希的,可以作为字典的 key。而像列表、字典等可变对象则不是可哈希的,它们不可以作为字典的 key。然后关于元组需要单独说明,如果元组里面的元素都是可哈希的,那么该元组也是可哈希的,反之则不是。

  而我们自定义类的实例对象也是可哈希的,并且哈希值是通过对象的地址计算得到的。

  因为哈希值一样,映射出来的索引自然也是相同的,所以在作为字典的 key 时,会发生冲突。由于类的实例对象之间默认不相等,因此会改变规则重新映射,找一个可以写入的位置。

  注意:我们自定义类的实例对象默认都是可哈希的,但如果类里面重写了 __eq__ 方法,且没有重写 __hash__ 方法的话,那么这个类的实例对象就不可哈希了。

  为什么会有这种现象呢?首先上面说了,在没有重写__hash__ 方法的时候,哈希值默认是根据对象的地址计算得到的。而且对象如果相等,那么哈希值一定是一样的,并且不可变。

  但我们重写了__eq__,相当于控制了== 操作符的比较结果,两个对象是否相等就由我们来控制了,可哈希值却还是根据地址计算得到的。因为两个对象地址不同,所以哈希值不同,但是对象却可以相等、又可以不相等,这就导致了矛盾。所以在重写了__eq__、但是没有重写 __hash__ 的情况下,其实例对象便不可哈希了。

  但如果重写了__hash__,那么哈希值就不再通过地址计算了,因此此时是可以哈希的。

  我们看到字典里面只有一个元素,因为重写了 __hash__ 方法之后,计算得到的哈希值都是一样的。如果没有重写 __eq__,实例对象之间默认是不相等的,因此哈希值一样,但是对象不相等,那么会重新映射。但我们重写了 __eq__,返回的结果是 True,所以 Python 认为对象是相等的,那么由于 key 的不重复性,只会保留一个键值对。

  但需要注意的是,在比较相等时,会先比较地址是否一样,如果地址一样,那么哈希表会直接认为相等。

  天哪噜,这是咋回事?首先整数在计算哈希值的时候,得到的结果就是其本身;而浮点数显然不是,但如果浮点数的小数点后面是 0,那么它和整数是等价的。

  因此3和3.0的哈希值一样,并且两者也是相等的,因此它们被视为同一个 key,所以相当于是更新。同理 True 也一样,因为 bool 继承自 int,所以它等价于 1,比如:9 + True = 10。因此 True 和 1 相等,并且哈希值也相等,那么索引d[True] = 345同样相当于更新。

  但是问题来了,值更新了我们可以理解,字典里面只有一个元素也可以理解,可为什么 key 一直是1呢?理论上最终结果应该是True才对啊。

  其实这算是 Python 偷了个懒吧(开个玩笑),因为 key 的哈希值是一样的,并且也相等,所以只会更新 value,而不会修改 key。

  从字典在设置元素的时候我们也知道,如果将 key 映射成索引之后,发现哈希索引数组的槽没有人用,那么就按照先来后到的顺序将键值对存储在键值对数组中,然后再把它在键值对数组中的索引存在哈希索引数组的指定槽中。

  但如果发现槽有人用了,那么根据槽里面存的索引,去键值对数组中查找指定的 entry,然后比较两个 key 是否相等。如果对应的 key 不相等,则重新映射找一个新的槽;如果相等,则说明是同一个 key,那么把 value 换掉即可。

  所以在替换元素的整个过程中,根本没有涉及到对键的修改,因此在上面那个例子中,value 会变、但 key 始终是 1,而不是 True。

  只要两个对象相等,并且哈希值相等,那么对于哈希表来说,它们就是同一个 key。

  另外我们反复在提哈希值,而哈希值是通过哈希函数运算得到的,一个理想的哈希函数要保证哈希值尽量均匀地分布于整个哈希空间中,越是相近的值,其哈希值差别应该越大。还是那句话,哈希函数对哈希表的好坏起着至关重要的作用。

  以上我们就详细地聊了聊对象的哈希值,如果对象可以计算哈希值,那么它一定实现了 __hash__ 方法,而内置的不可变对象都实现了。

  Seurat 4.0 单细胞转录组数据整合(scRNA-seq integration)

  Seurat 4.0 单细胞转录组数据整合(scRNA-seq integration)

  Vue 前端开发中,表单组件是排在前三的高频使用的组件,如何快速构建表单,节省力气,避免重复造轮子呢,选择一款适合自己的前端表单设计器就非常重要了。本文介绍 4 款顶级好用的 Vue 表单设计器,其中最后一款卡拉云,是新一代低代码开发工具,不仅能自动生成各类表单,还可以拖拽生成其他常见的前端组件,一行代码连接前后端数据,可快速接入数据库/api。它是表单设计器的超集,可直接生成属于你的后台管理工具,无敌好用。

  基于SpringBoot校园失物招领系统的设计与实现(程序+数据库+文档)

  基于SpringBoot校园失物招领系统的设计与实现(程序+数据库+文档)

  Python 源文件编译之后会得到什么,它的结构是怎样的?和字节码又有什么联系?

  Python 源文件编译之后会得到什么,它的结构是怎样的?和字节码又有什么联系?

  哈希算法在计算机科学中有着广泛而重要的应用,从数据存储、数据完整性校验到密码安全和分布式系统中的负载均衡,哈希函数都发挥着关键作用。通过本文的介绍和示例代码,希望您能更好地理解哈希的基本概念和实际应用,并在您的项目中有效地应用这些知识。

  RTSP服务器之————rtsp-server(轻量级RTSP / RTP流媒体服务器)

  AnythingLLM vs Cherry Studio vs Chatbox:三大AI工具深度横评

  构建AI智能体:五十、ModelScope MCP广场 · MCP协议 · Cherry Studio:AI应用生产线

  YOLOv11改进 - 卷积Conv 加权卷积wConv:无损替换标准卷积,增强空间建模与特征提取质量

  YOLOv11 改进 - 注意力机制 MCAttn 蒙特卡洛注意力:全局上下文与局部细节协同建模,破解微小目标特征表达难题

  YOLOv11 改进 - 注意力机制 DCAFE双坐标注意力:并行坐标注意力 + 双池化融合

地址:广东省广州市  电话:020-66889888 手机:13988889999
Copyright © 2012-2025 HASH GAME(哈希游戏) 版权所有 非商用版本 ICP备案编: