Hash算法(含python實現)


1. 簡介

哈希(hash)也翻譯作散列。Hash算法,是將一個不定長的輸入,通過散列函數變換成一個定長的輸出,即散列值。

這種散列變換是一種單向運算,具有不可逆性即不能根據散列值還原出輸入信息,因此嚴格意義上講Hash算法是一種消息摘要算法,不是一種加密算法。常見的hash算法有:SM3、MD5、SHA-1等 。

2. 應用

Hash主要應用在數據結構以及密碼學領域。

在不同的應用場景下,hash函數的選擇也會有所側重。比如在管理數據結構時,主要要考慮運算的快速性,並且要保證hash均勻分布;而應用在密碼學中就要優先考慮抗碰撞性,避免出現兩段不同明文hash值相同的情況發生。

2.1 在密碼學領域的應用

在密碼學中,Hash算法的作用主要是用於消息摘要和簽名,換句話說,它主要用於對整個消息的完整性進行校驗。比如一些登陸網站並不會直接明文存儲用戶密碼,存儲的是經過hash處理的密碼的摘要(hash值),當用戶登錄時只需要對比輸入明文的摘要與數據庫存儲的摘要是否相同;即使黑客入侵或者維護人員訪問數據庫也無法獲取用戶的密碼明文,大大提高了安全性。

2.2 在數據結構中的應用

使用Hash算法的數據結構叫做哈希表,也叫散列表,主要是為了提高查詢的效率。它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數就是hash函數,存放記錄的數組叫做哈希表。在數據結構中應用時,有時需要較高的運算速度而弱化考慮抗碰撞性,可以使用自己構建的哈希函數。

3. 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())


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM