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()的講解,如有問題歡迎留言指出。
新聞熱點
疑難解答