首 页IT知识库收藏内容
当前位置:翔宇亭IT乐园IT知识库Python

Python hash()函数

减小字体 增大字体 作者:本站  来源:本站整理  发布时间:2021-07-31 09:32:29

Python hash()函数是Python中的一个内建函数,其作用是生成一个对象的hash值,hash值的作用是使用整数来标识一个数据。通常讲,相同的数据具有相同的hash值,即使数据之间具有微小的区别,其hash值也是不同的。Hash值通过hash函数来生成。当然,通过hash函数生成的hash值,可能导致两个对象会生成相同的hash值,这称之为:hash冲突,一个较好的hash函数应该较小概率的产生hash冲突。

Python hash()语法格式

hash(object)

参数

object:要计算其哈希值的数据对象。

返回值

一个数字构成的哈希值。

Python hash()函数

Python hash()函数示例

h1 = hash(1234)
h2 = hash(1234.0)
h3 = hash(1234.1)
h4 = hash('翔宇亭IT乐园')
h5 = hash('公众号:优雅的代码')
print(f'hash(1234)={h1},hash(1234.0)={h2}')
print(f'hash(1234.1)={h3}')
print(f"hash('翔宇亭IT乐园')={h4}")
print(f"hash('公众号:优雅的代码')={h5}")

运行结果如下:

hash(1234)=1234,hash(1234.0)=1234
hash(1234.1)=230584300921160914
hash('翔宇亭IT乐园')=-8515451810589210348
hash('公众号:优雅的代码')=2285016638880305041

从上面的运行结果看,大小相等的整型数字生成的hash结果相同,而且就是数字本身的值,而浮点数的哈希值和字符串与其本身差别就很大了。而且,对于数字来讲,每次运行的结果都会相同,而计算的字符串的hash结果不一定相同,看下图在Python3.8.2中两次运行的结果:

Python hash()函数的运行结果

另外,该函数不能使用于可变的序列和集合对象,如列表,字典,集合等。

h6 = hash([11,12,13])
print(h6)

输出结果:

Traceback (most recent call last):
  File "D:/01Lesson/PY/hash.py", line 1, in <module>
    h6 = hash([11,12,13])
TypeError: unhashable type: 'list'

这主要是因为可变对象的值可能不断的发生变化,系统维护其哈希值会付出更大的代价。

但是对不包含可变元素的元组可以使用hash()函数,再看看下面的例子:

h7 = hash((11,12,13))
print(h7)
h8 = hash((11,12,"翔宇亭"))
print(h8)
h9 = hash((11,12,[31,32]))
print(h9)

输出结果:

-7705240637186569705
-548399335895946643
Traceback (most recent call last):
  File "D:/01Lesson/PY/hash.py", line 5, in <module>
    h9 = hash((11,12,[31,32]))
TypeError: unhashable type: 'list'

上面的例子中,最后一个例子,因为元组中的最后一个元素是可变的列表,因此也不能作为hash()函数的参数。

 hash()函数用于自定义对象

在对象内部,通过覆写__hash__()函数可以实现对自定义对象的hash().

class WebSite:
    def __init__(self,name,url):
        self.name = name
        self.url = url

    def __eq__(self,other):
        return self.name == other.name and self.url == other.url

    def __hash__(self):
        return hash((self.name,self.url))

ws = WebSite("翔宇亭IT乐园","biye5u.com")
print("自定义对象hash:",hash(ws))

输出结果:

自定义对象hash: 5493462333876275792

上面的例子中,__eq__()函数用于判断两个对象是否相等的,可以不必定义。

以上是关于Python内置函数hash()的讲解,如有问题欢迎留言指出。


如需转载,请注明出处:翔宇亭IT乐园(http://www.biye5u.com),并给出本文链接地址:

http://www.biye5u.com/article/python/2021/6528.html

微信搜索“优雅的代码”关注本站的公众号,或直接使用微信扫描下面二维码关注本站公众号,以获取最新内容。

个人成长离不开各位的关注,你的关注就是我继续前行的动力。

知识评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
愿您的精彩评论引起共鸣,带来思考和价值。
用户名: 查看更多评论
分 值:100分 90分 80分 70分 60分 40分 20分
内 容:
验证码:
关于本站 | 网站帮助 | 广告合作 | 网站声明 | 友情连接 | 网站地图
本站部分内容来自互联网,如有侵权,请来信告之,谢谢!
Copyright © 2007-2024 biye5u.com. All Rights Reserved.