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