首页 > 开发 > Python > 正文

Python hash()函数

2023-04-24 19:21:38
字体:
来源:转载
供稿:网友

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('武林网VEVB')
h5 = hash('公众号:优雅的代码')
print(f'hash(1234)={h1},hash(1234.0)={h2}')
print(f'hash(1234.1)={h3}')
print(f"hash('武林网VEVB')={h4}")
print(f"hash('公众号:优雅的代码')={h5}")

运行结果如下:

hash(1234)=1234,hash(1234.0)=1234
hash(1234.1)=230584300921160914
hash('武林网VEVB')=-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("武林网VEVB","VeVb.com")
print("自定义对象hash:",hash(ws))

输出结果:

自定义对象hash: 5493462333876275792

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

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

上一篇:Python float()函数

下一篇:Python id()函数

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表