Python hash()函數(shù)是Python中的一個內(nèi)建函數(shù),其作用是生成一個對象的hash值,hash值的作用是使用整數(shù)來標識一個數(shù)據(jù)。通常講,相同的數(shù)據(jù)具有相同的hash值,即使數(shù)據(jù)之間具有微小的區(qū)別,其hash值也是不同的。Hash值通過hash函數(shù)來生成。當(dāng)然,通過hash函數(shù)生成的hash值,可能導(dǎo)致兩個對象會生成相同的hash值,這稱之為:hash沖突,一個較好的hash函數(shù)應(yīng)該較小概率的產(chǎn)生hash沖突。
hash(object)
object:要計算其哈希值的數(shù)據(jù)對象。
一個數(shù)字構(gòu)成的哈希值。
h1 = hash(1234)
h2 = hash(1234.0)
h3 = hash(1234.1)
h4 = hash('武林網(wǎng)VEVB')
h5 = hash('公眾號:優(yōu)雅的代碼')
print(f'hash(1234)={h1},hash(1234.0)={h2}')
print(f'hash(1234.1)={h3}')
print(f"hash('武林網(wǎng)VEVB')={h4}")
print(f"hash('公眾號:優(yōu)雅的代碼')={h5}")
運行結(jié)果如下:
hash(1234)=1234,hash(1234.0)=1234
hash(1234.1)=230584300921160914
hash('武林網(wǎng)VEVB')=-8515451810589210348
hash('公眾號:優(yōu)雅的代碼')=2285016638880305041
從上面的運行結(jié)果看,大小相等的整型數(shù)字生成的hash結(jié)果相同,而且就是數(shù)字本身的值,而浮點數(shù)的哈希值和字符串與其本身差別就很大了。而且,對于數(shù)字來講,每次運行的結(jié)果都會相同,而計算的字符串的hash結(jié)果不一定相同,看下圖在Python3.8.2中兩次運行的結(jié)果:
另外,該函數(shù)不能使用于可變的序列和集合對象,如列表,字典,集合等。
h6 = hash([11,12,13])
print(h6)
輸出結(jié)果:
Traceback (most recent call last):
File "D:/01Lesson/PY/hash.py", line 1, in <module>
h6 = hash([11,12,13])
TypeError: unhashable type: 'list'
這主要是因為可變對象的值可能不斷的發(fā)生變化,系統(tǒng)維護其哈希值會付出更大的代價。
但是對不包含可變元素的元組可以使用hash()函數(shù),再看看下面的例子:
h7 = hash((11,12,13))
print(h7)
h8 = hash((11,12,"武林網(wǎng)"))
print(h8)
h9 = hash((11,12,[31,32]))
print(h9)
輸出結(jié)果:
-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()函數(shù)的參數(shù)。
在對象內(nèi)部,通過覆寫__hash__()函數(shù)可以實現(xiàn)對自定義對象的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("武林網(wǎng)VEVB","VeVb.com")
print("自定義對象hash:",hash(ws))
輸出結(jié)果:
自定義對象hash: 5493462333876275792
上面的例子中,__eq__()函數(shù)用于判斷兩個對象是否相等的,可以不必定義。
以上是關(guān)于Python內(nèi)置函數(shù)hash()的講解,如有問題歡迎留言指出。
新聞熱點
疑難解答
圖片精選