Python hash()函数是Python中的一个内建函数,其作用是生成一个对象的hash值,hash值的作用是使用整数来标识一个数据。通常讲,相同的数据具有相同的hash值,即使数据之间具有微小的区别,其hash值也是不同的。Hash值通过hash函数来生成。当然,通过hash函数生成的hash值,可能导致两个对象会生成相同的hash值,这称之为:hash冲突,一个较好的hash函数应该较小概率的产生hash冲突。
hash(object)
object:要计算其哈希值的数据对象。
一个数字构成的哈希值。
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中两次运行的结果:
另外,该函数不能使用于可变的序列和集合对象,如列表,字典,集合等。
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().
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()的讲解,如有问题欢迎留言指出。
新闻热点
疑难解答