国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Python > 正文

Python hash()函數(shù)

2023-04-24 19:21:38
字體:
供稿:網(wǎng)友

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沖突。

Python hash()語法格式

hash(object)

參數(shù)

object:要計算其哈希值的數(shù)據(jù)對象。

返回值

一個數(shù)字構(gòu)成的哈希值。

Python hash()函數(shù)

Python hash()函數(shù)示例

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é)果:

Python hash()函數(shù)的運行結(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ù)。

 hash()函數(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()的講解,如有問題歡迎留言指出。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀仁县| 赤壁市| 阿拉善右旗| 监利县| 阿图什市| 富川| 上林县| 竹溪县| 绥宁县| 宁波市| 磐石市| 元谋县| 万州区| 加查县| 晋宁县| 错那县| 从江县| 江北区| 大丰市| 绍兴县| 海门市| 银川市| 保靖县| 大田县| 凯里市| 盘锦市| 仁寿县| 苗栗县| 五大连池市| 历史| 房产| 天津市| 锡林浩特市| 镇原县| 信丰县| 苍南县| 石渠县| 巴彦淖尔市| 舒城县| 九寨沟县| 太仓市|