Python里hash函数原理 Python内置hash()函数的实现机制解析

hash()函数用于生成对象的哈希值,是基于对象内容计算出的整数,用于快速比较和查找。1.哈希值不是加密,而是整数标识;2.不同对象可能有相同哈希值,称为哈希冲突;3.只有不可变对象如整数、字符串、元组可被哈希;4.整数哈希值为其自身,字符串使用siphash算法计算;5.元组若包含不可哈希元素则不可哈希;6.自定义类需重写__hash__方法以支持哈希操作;7.hash值不唯一、不稳定且依赖环境设置。理解哈希机制有助于提升代码效率。

Python 中的 hash() 函数看起来简单,但背后其实涉及不少机制。它不是对对象“加密”或“摘要”,而是为对象生成一个整数,用来快速判断对象是否相等、用于字典和集合这类基于哈希表的数据结构中。

什么是 hash 值?

hash() 返回的是一个整数值,表示该对象的“哈希值”。这个值在对象生命周期内保持不变(前提是对象不可变),主要用于快速查找和比较。

比如:

>>> hash(10)10>>> hash("hello")-9478562939069926921  # 这个数字可能每次运行都不一样,取决于 Python 的实现和环境

不同对象可能会有相同的哈希值,这叫“哈希冲突”,是正常现象。

立即学习“Python免费学习笔记(深入)”;

不同类型对象的 hash 实现方式不一样

Python 中并不是所有对象都能被 hash()。只有那些不可变的对象才支持哈希,比如整数、字符串、元组;而列表、字典这些可变对象则不能被哈希。

整数和浮点数

整数的哈希值就是它自己:

>>> hash(42)42

浮点数的哈希值则稍复杂,但基本也是映射成一个固定的整数。

字符串

字符串的哈希值是根据内容计算出来的。Python 使用了一种叫做“SipHash”的算法(具体版本可能因 Python 版本和编译选项而异)来计算字符串的哈希值。这样做的目的是为了防止哈希碰撞攻击。

例如:

>>> hash("abc")-123456789  # 每次运行结果可能不同(Python 启动时随机种子会影响)

注意:从 Python 3.3 开始,字符串的哈希值会受 PYTHONHASHSEED 环境变量影响,这是为了增加安全性。

元组

如果元组中的元素都是可哈希的,那么整个元组也是可哈希的:

>>> hash((1, 2, 3))123456789

但如果元组里包含列表或其他不可哈希对象,调用 hash() 会报错:

>>> hash((1, [2, 3]))TypeError: unhashable type: 'list'

自定义类的 hash 实现

如果你自定义了一个类,默认情况下它的实例是可哈希的(因为默认使用的是对象的 id)。但如果你重写了 __eq__ 方法,通常也应该同时重写 __hash__ 方法,否则你的对象在放入字典或集合中时会出现问题。

举个例子:

class Person:    def __init__(self, name):        self.name = name    def __eq__(self, other):        return self.name == other.name    def __hash__(self):        return hash(self.name)

这样你就可以把 Person 对象作为字典的键或者集合的元素了。

hash() 的局限性与注意事项

不是加密:hash() 并不是为了安全设计的,不要用它来做密码哈希。值不唯一:不同的对象可能有相同的 hash 值,这就是哈希冲突。值不稳定:某些类型的 hash 值在每次 Python 启动时都可能变化(如字符串)。只适用于不可变对象:列表、字典这种可变对象不能被哈希。环境依赖:PYTHONHASHSEED 设置会影响字符串等类型的哈希值。

基本上就这些。理解 hash 的原理有助于写出更高效的代码,尤其是在使用字典、集合或自定义类的时候。

以上就是Python里hash函数原理 Python内置hash()函数的实现机制解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1362543.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 01:54:51
下一篇 2025年12月14日 01:55:03

相关推荐

  • Python里pytest.fixture pytest测试框架中fixture的依赖注入机制

    fixture的依赖注入是指在pytest中通过参数传递的方式,让一个fixture依赖另一个fixture的返回值,从而形成资源准备的链式调用。具体来说,在定义某个fixture时,可将其所需的其他fixture作为参数传入,pytest会自动按需执行依赖的fixture并传递结果。例如:user…

    好文分享 2025年12月14日
    000
  • Python特征工程 Python机器学习数据预处理

    数据预处理和特征工程决定模型表现上限,需重视数据质量而非仅调参。1. 缺失值处理应先理解原因,再选择填充或保留缺失信息,避免直接删除;2. 类别编码根据类别数量选择one-hot或目标编码,防止维度爆炸;3. 特征缩放视模型而定,树模型无需缩放,线性模型则需标准化或归一化;4. 构造衍生特征应结合业…

    2025年12月14日
    000
  • Python协程编程指南 Python异步IO实现原理剖析

    协程是用户态轻量级线程,适合异步编程的原因在于其低启动成本、小切换开销及同步化代码风格。1. 协程由程序员控制调度,适合io密集型任务;2. 异步io依赖事件循环,负责协程调度与io监听;3. 使用async/await需注意函数定义、awaitable对象及避免阻塞主线程;4. 实际开发中通过并发…

    2025年12月14日
    000
  • Python中如何提取视频帧?

    在python中提取视频帧可以使用opencv库。1)安装并导入opencv。2)使用cv2.videocapture打开视频文件。3)逐帧读取并保存为图片。4)可设置间隔减少保存帧数。5)使用try-except处理异常。6)优化时可使用多线程或降低分辨率。 在Python中提取视频帧是一项常见的…

    2025年12月14日
    000
  • python中的关键字有哪些 python保留关键字列表及作用

    python的关键字有35个,截至python 3.9。它们分别是:1. false, true, none:布尔和空值常量;2. and, or, not:逻辑运算符;3. as:用于别名;4. assert:调试用;5. async, await:异步编程;6. break:跳出循环;7. cl…

    2025年12月14日
    000
  • 学python能干嘛 学习后就业方向

    学python可以从事web开发、数据科学、人工智能和自动化测试等多种职业。1)web开发:使用django和flask框架开发网站。2)数据科学:利用numpy和pandas处理数据。3)人工智能:通过tensorflow和pytorch开发ai应用。4)自动化测试:使用pytest和ansibl…

    2025年12月14日
    000
  • Python音频处理技术 Python音频分析与编辑方法

    python处理音频常见方法包括播放录制、剪切拼接、分析内容及注意细节。1.播放和录制可用pydub和pyaudio,前者适合格式转换,后者适合实时录音;2.剪切拼接通过切片操作实现,音量调整通过加减运算完成;3.分析音频可用librosa库,支持频谱分析、节拍提取、特征提取等;4.需注意格式转换、…

    2025年12月14日
    000
  • Python中time.sleep功能 时间模块sleep函数在延迟执行中的应用

    python中的time.sleep()用于暂停程序执行指定时间,属于time模块,使用时需导入该模块,并传入以秒为单位的整数或浮点数参数。1. 它会阻塞当前线程,在单线程脚本中适用,但并发环境下需谨慎使用;2. 常用于控制循环频率、模拟延迟及简单定时任务;3. 注意其精度可能受系统资源影响,不适合…

    好文分享 2025年12月14日
    000
  • Python里sys.argv的含义 sys模块中命令行参数argv的用法说明

    sys.argv用于获取python脚本的命令行参数。1. 参数以列表形式存储,第一个元素是脚本名称;2. 使用前需导入sys模块;3. 可通过索引访问参数,但需先判断参数个数或使用异常处理避免错误;4. 常见用途包括处理配置项和批量处理文件;5. 注意事项包括参数均为字符串、顺序重要、含空格需加引…

    好文分享 2025年12月14日
    000
  • python中del是什么意思 python中del删除对象的用法解析

    在python中,del用于删除对象的引用。1)删除变量:del x会移除变量x的引用,导致x不再存在。2)删除列表元素:del my_list[2]会删除索引为2的元素。3)删除列表切片:del my_list[1:3]会删除指定范围内的元素。4)删除字典键值对:del my_dict[&#821…

    2025年12月14日
    000
  • Python中如何绘制饼图?

    在python中绘制饼图的最常用工具是matplotlib库。使用matplotlib绘制饼图的步骤包括:1)导入库并准备数据,2)使用plt.pie()函数绘制基本饼图,3)通过colors、explode、shadow等参数定制饼图的外观,4)确保饼图是圆形并添加标题,最后显示图表。 在Pyth…

    2025年12月14日
    000
  • Python网络编程基础入门 Python网络通信关键技术点

    学python网络编程的关键在于理解网络通信的基本逻辑和常用方法。要让两个程序通过网络“说话”,首先要掌握socket通信,它是python网络编程的基础。服务端需监听ip和端口,客户端连接后即可传输数据。其次,要分清tcp和udp的区别:1. tcp是可靠的、面向连接的协议,适合传文字等对可靠性要…

    2025年12月14日
    000
  • Python密码学基础 Python加密算法库实战

    python在密码学领域常用场景包括对称加密、哈希处理和非对称加密。1.使用cryptography库实现aes-gcm对称加密,可加密和解密数据,需注意nonce唯一性和密钥保密;2.用hashlib结合salt及bcrypt实现安全密码存储,避免使用md5或sha-1;3.通过pycryptod…

    2025年12月14日
    000
  • Python中zipfile模块 压缩文件操作库zipfile的完整使用解析

    如何用python的zipfile模块处理zip文件?答案如下:1. 读取zip文件时,使用zipfile类打开并调用namelist()查看文件列表,或用extractall()解压全部内容;2. 创建zip文件时,以写模式打开zipfile并调用write()添加文件,推荐使用with语句管理资…

    好文分享 2025年12月14日
    000
  • pycharm是什么语言写的 开发语言技术解析

    pycharm是用java开发的。具体来说,pycharm利用java的生态系统和库构建,基于intellij idea平台,集成了python解释器,支持跨平台运行,并通过多线程和异步处理优化性能。 PyCharm是什么语言写的?这个问题其实涉及到软件开发的多种技术栈。PyCharm作为一个功能强…

    2025年12月14日
    000
  • Python文件操作技巧 Python读写文件常见方法汇总

    使用 with open 是 python 文件操作最稳妥的方式,能自动关闭文件避免资源泄露。常见模式包括 ‘r’ 只读、’w’ 写入(清空原内容)、’a’ 追加写入、’rb’/’wb&#82…

    2025年12月14日
    000
  • Python里pprint美观打印 复杂数据结构美观输出pprint的格式化

    在python中处理复杂数据结构时,使用pprint模块能更清晰地打印输出。1. 基本使用是将print()替换为pprint.pprint()以实现美观格式;2. 通过width参数控制每行最大字符数;3. 使用indent设置缩进级别,sort_dicts控制字典键的排序;4. pformat(…

    好文分享 2025年12月14日
    000
  • Python里calendar模块 日期处理calendar的月历生成功能

    要生成月历用calendar.month(year,month),要按周组织日期用calendar().monthdatescalendar(year,month),判断闰年用isleap(),获取星期几用weekday()。1. calendar.month(year, month)可生成类似li…

    好文分享 2025年12月14日
    000
  • Python脚本自动化 Python日常任务批量处理技巧

    python自动化能高效解决重复性工作,如文件整理、数据处理和邮件发送等。针对文件整理,可使用os和shutil模块扫描文件后缀并按类型归类,创建对应文件夹后移动或复制文件,同时建议使用日志记录功能辅助排查问题。对于批量修改内容或重命名,可通过脚本读取文件、替换关键词并保存,结合正则表达式实现复杂格…

    2025年12月14日
    000
  • Python中id()函数作用 对象标识符id()的内存地址查询原理

    id()函数的作用是返回对象的唯一标识符,通常对应内存地址。它是一个内建函数,通过传入对象即可获取id,如a=100后调用id(a)会输出类似140392185726448的值。需要注意的是,同一对象在不同运行时id会变化,不同对象即使值相同id也可能不同。对于-5到256之间的整数,python会…

    好文分享 2025年12月14日
    000

发表回复

登录后才能评论
关注微信