- ·上一篇内容:Python float()函数
- ·下一篇内容:Python id()函数
Python hash()函数
Python hash()函数是Python中的一个内建函数,其作用是生成一个对象的hash值,hash值的作用是使用整数来标识一个数据。通常讲,相同的数据具有相同的hash值,即使数据之间具有微小的区别,其hash值也是不同的。Hash值通过hash函数来生成。当然,通过hash函数生成的hash值,可能导致两个对象会生成相同的hash值,这称之为:hash冲突,一个较好的hash函数应该较小概率的产生hash冲突。
Python hash()语法格式
hash(object)
参数
object:要计算其哈希值的数据对象。
返回值
一个数字构成的哈希值。
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中两次运行的结果:
另外,该函数不能使用于可变的序列和集合对象,如列表,字典,集合等。
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
微信搜索“优雅的代码”关注本站的公众号,或直接使用微信扫描下面二维码关注本站公众号,以获取最新内容。
个人成长离不开各位的关注,你的关注就是我继续前行的动力。