python中含有內(nèi)置的函數(shù)去給對象生成哈希值,也就是hash()函數(shù),這個函數(shù)將一個對象作為輸入,返回一個整數(shù)的hash值。
內(nèi)部的,這個函數(shù)涉及到.\__hash\__()這個輸入對象的方法,所以呢,如果你想使你的自定義類可哈?;?,你需要做的是實現(xiàn).\__hash__()這個方法返回出一個整數(shù),這個整數(shù)是基于你的對象的內(nèi)部狀態(tài)決定的。
先開始一些基本的小例子,先對數(shù)值進(jìn)行散列
>>>hash(1)
1
>>>hash(10)
10
>>>hash(10.00)
10
>>>hash(10.01)
230584300921368586
>>>hash(-10.01)
-230584300921368586
如果你好奇為什么這些hash值看起來有不同的長度,請記住在Python中hash()函數(shù)返回的是整數(shù)對象,他們都會在標(biāo)準(zhǔn)的64位Python解釋器中通過24字節(jié)呈現(xiàn)。
正如你可以看到的,整數(shù)的哈希值默認(rèn)的就是它本身,不管你哈希的數(shù)據(jù)類型是什么,所以整數(shù)1和浮點數(shù)1.0哈希值都是1.
這個有什么特殊的么,這個展示了你之前學(xué)到的知識,也就是hash函數(shù)經(jīng)常是單向的函數(shù),如果兩個不同的對象具有相同的hash值,根本不可能做反向工程,也就是從hash值返回到原始的對象,這也就使得被hash的原始數(shù)據(jù)類型的信息被丟失。
另幾個有趣的可以關(guān)注的hash事情是,小數(shù)的散列值不同于它本身,負(fù)數(shù)具有負(fù)的哈希值。還有一點,就是如果兩個對象具有相同的哈希值,稱為哈希碰撞。
哈希一個字符串不同于對數(shù)值進(jìn)行哈希。
>>>hash("BadBehaviour")
7164800052134507161
DOS攻擊(DOS代表拒絕服務(wù))是指攻擊者故意耗盡計算機(jī)系統(tǒng)的資源,使系統(tǒng)不再能夠向客戶端提供服務(wù)的攻擊。在ScottCrosby演示的這個攻擊的具體案例中,攻擊可能會使目標(biāo)系統(tǒng)充斥大量的數(shù)據(jù),這些數(shù)據(jù)的哈希沖突導(dǎo)致目標(biāo)系統(tǒng)使用更多的計算能力來解決沖突。
以上內(nèi)容為大家介紹了Python里的hash()函數(shù),希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。