自增知識點
1,哈希
什么是可哈希(hashable)?
簡要的說可哈希的數據類型,即不可變的數據結構(字符串str、元組tuple、對象集objects)。
哈希有啥作用?
它是一個將大體量數據轉化為很小數據的過程,甚至可以僅僅是一個數字,以便我們可以用在固定的時間復雜度下查詢它,所以,哈希對高效的算法和數據結構很重要。
什么是不可哈希(unhashable)?
同理,不可哈希的數據類型,即可變的數據結構 (字典dict,列表list,集合set)
hash(object)
hash() 用於獲取取一個對象(字符串或者數值等)的哈希值。返回對象的哈希值。
Hash算法(含python實現)
-
簡介
哈希(hash)也翻譯作散列。Hash算法,是將一個不定長的輸入,通過散列函數變換成一個定長的輸出,即散列值。
這種散列變換是一種單向運算,具有不可逆性即不能根據散列值還原出輸入信息,因此嚴格意義上講Hash算法是一種消息摘要算法,不是一種加密算法。常見的hash算法有:SM3、MD5、SHA-1等 。 -
應用
Hash主要應用在數據結構以及密碼學領域。
在不同的應用場景下,hash函數的選擇也會有所側重。比如在管理數據結構時,主要要考慮運算的快速性,並且要保證hash均勻分布;而應用在密碼學中就要優先考慮抗碰撞性,避免出現兩段不同明文hash值相同的情況發生。
2.1 在密碼學領域的應用
在密碼學中,Hash算法的作用主要是用於消息摘要和簽名,換句話說,它主要用於對整個消息的完整性進行校驗。比如一些登陸網站並不會直接明文存儲用戶密碼,存儲的是經過hash處理的密碼的摘要(hash值),當用戶登錄時只需要對比輸入明文的摘要與數據庫存儲的摘要是否相同;即使黑客入侵或者維護人員訪問數據庫也無法獲取用戶的密碼明文,大大提高了安全性。
2.2 在數據結構中的應用
使用Hash算法的數據結構叫做哈希表,也叫散列表,主要是為了提高查詢的效率。它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數就是hash函數,存放記錄的數組叫做哈希表。在數據結構中應用時,有時需要較高的運算速度而弱化考慮抗碰撞性,可以使用自己構建的哈希函數。 -
Hash算法的python實現
3.1 自定義哈希函數
自定義哈希函數通常可利用除留余數、移位、循環哈希、平方取中等方法。下面這個例子就是我自己定義的一個哈希函數,運用了取模運算和異或運算。 -
coding:utf-8
-
自定義哈希函數
-
def my_hash(x):
-
return (x % 7) ^ 2
-
print(my_hash(1)) # 輸出結果:3
-
print(my_hash(2)) # 輸出結果:0
-
print(my_hash(3)) # 輸出結果:1
-
print(my_hash(4)) # 輸出結果:6
3.2 hash()函數
在python中有內置的哈希函數hash(),返回一個對象(數字、字符串,不能直接用於 list、set、dictionary)的哈希值。示例代碼如下: -
coding:utf-8
-
hash()
-
print(hash(1))
-
print(hash(1.0)) # 相同的數值,不同類型,哈希值是一樣的
-
print(hash("abc"))
-
print(hash("hello world"))
在運行時發現了一個現象:相同字符串在同一次運行時的哈希值是相同的,但是不同次運行的哈希值不同。這是由於Python的字符串hash算法有一個啟動時隨機生成secret prefix/suffix的機制,存在隨機化現象:對同一個字符串輸入,不同解釋器進程得到的hash結果可能不同。因此當需要做可重現可跨進程保持一致性的hash,需要用到hashlib模塊。
3.3 hashlib模塊
hashlib提供了常見的摘要算法,如MD5,SHA1等等。示例代碼如下: -
coding:utf-8
-
使用hashlib模塊
-
import hashlib
-
md5 = hashlib.md5() # 應用MD5算法
-
data = "hello world"
-
md5.update(data.encode('utf-8'))
-
print(md5.hexdigest())
可變類型的數據不可哈希,如list,字典:同值不同址,不同值同址
列表,字典可變,
數值、字母、字符串、數字、元組不可變:同值同址,不同值不同址
怎么判斷可變不可變 ?總結:改個值 看id是不是一樣,id一樣的為可變,則不可哈希,
改了值,id變化,則為不可變,則可哈希
哈希概念:Hash,一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
哈希算法:哈希算法是用來解決數據和數據之間對應關系的一種算法。它的初衷是用來加速數據存取。
計算機領域內的大多數查找算法都與存儲數據的規模呈正相關,用於衡量查找算法效率的量我們稱為平均查找長度,一般情況下,比較優秀的查找算法的平均查找長度也不會短於數據規模以2為底的對數()。