哈希(Hash)算法:`hash(object)`
一贷祈,基本概念
哈希算法將一個不定長的輸入途乃,通過散列函數(shù)變換成一個定長的輸出娘赴,即散列值憾儒。是一種信息摘要算法询兴。對象的hash值比原對象擁有更低的內(nèi)存復(fù)雜度。
?二起趾,hash算法與加密的區(qū)別
它不同于加密诗舰。哈希(hash)是將目標(biāo)文本轉(zhuǎn)換成具有相同長度的,不可逆的雜湊字符串训裆,而加密則是將文本轉(zhuǎn)換為具有相同長度的眶根,可逆的密文。
哈希(hash)算法是不可逆的边琉,只能由輸入產(chǎn)生輸出属百,不能由輸出產(chǎn)生輸入。而加密則是可逆的变姨。即可以從輸入產(chǎn)生輸出族扰,也可以反過來從輸出推出輸入。
三定欧,哈希碰撞(Collision)
對于hash算法渔呵,不同的數(shù)據(jù)應(yīng)該生成不同的哈希值。如果兩個不同的數(shù)據(jù)經(jīng)過Hash函數(shù)計算得到的Hash值一樣砍鸠。就稱為哈希碰撞(collision)厘肮。哈希碰撞無法被完全避免。只能降低發(fā)生概率睦番。
好的hash函數(shù)會導(dǎo)致最少的hash碰撞。
*
?四耍属,為什么不能對可變的對象進(jìn)行hash處理托嚣?
可哈希性(hashable):
可哈希的數(shù)據(jù)類型為不可變的數(shù)據(jù)結(jié)構(gòu)(如字符串srt,元組tuple厚骗,對象集objects等)示启。這種數(shù)據(jù)被稱為可哈希性。
不可哈希性:
不可哈希的數(shù)據(jù)類型领舰,為可變的數(shù)據(jù)結(jié)構(gòu)(如字典dict夫嗓,列表list和集合set等)。
如果對可變的對象進(jìn)行哈希處理冲秽,則每次對象更新時舍咖,都需要更新哈希表。這樣我們則需要將對象移至不同的數(shù)據(jù)集锉桑,這種操作會使花費(fèi)過大排霉。
因此設(shè)定不能對可變的對象進(jìn)行hash處理。
**
五民轴,Python3.x增加的隨機(jī)性
**
Python3.x添加了hash算法的隨機(jī)性攻柠,以提高安全性球订,因此對于每個新的python調(diào)用,同樣的數(shù)據(jù)源生成的結(jié)果都將不同瑰钮。
哈希方法有(MD5, SHA1, SHA256與SHA512等)冒滩。常用的有SH256與SHA512。MD5與SHA1不再常用浪谴。
- MDH5 (不常用)
- SHA1 (不常用)
- SHA256 (常用)
- SHA512 (常用)
六开睡,其他hash算法
1. simhash算法:
一種局部敏感的hash算法,它產(chǎn)生的簽名在一定程度上可以表征原內(nèi)容的相似度较店。
> 可以被用來比較文本的相似度士八。
安裝simhash:
Pip3 install simhash
**2. Imagehash算法:*
感知哈希算法(perceptual Hash Algorithm)。用于檢測圖像和視頻的差異梁呈。
安裝Imagehash:
pip3 install Imagehash
比較下面兩張圖片的Imagehash值
可以看到兩張圖片的hash值非常相似婚度。相似的圖片可以生成相似的哈希值是Imagehash的特點(diǎn)。