1. 程式人生 > 實用技巧 >簡單認識Hash(雜湊)

簡單認識Hash(雜湊)

從事過計算機行業的人,多多少少都會聽說過這個概念,尤其是用過redis資料庫的人,但是又對其很模糊,那麼到底什麼是Hash呢?Hash又可以做什麼?

具體操作以及具體操作講解可參考 :https://www.zhihu.com/question/26762707/answer/40119521

定義

Hash一般翻譯為雜湊,還有音譯為雜湊,通過百度以及谷歌都沒有直接找到Hash的定義,而是找到了一些相關的概念,雜湊演算法,雜湊函式,雜湊表等概念。

hash(雜湊、雜湊)函式,是將任意長度的資料對映到有限長度的域上。直觀解釋起來,就是對一串資料m進行雜糅,輸出另一段固定長度的資料h,作為這段資料的特徵(指紋)

也就是說,無論資料塊m有多大,其輸出值h為固定長度。到底是什麼原理?將m分成固定長度(如128位),依次進行hash運算,然後用不同的方法迭代即可(如前一塊的hash值與後一塊的hash值進行異或)。如果不夠128位怎麼辦?用0補全或者用1補全隨意,演算法中約定好就可以了。

我所理解的雜湊是指一個過程,這個過程就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,所輸出的稱為雜湊值, 不同hash演算法所得出hash值也是有很大區別。這種變換是一種壓縮對映,也即雜湊值所佔的空間一般來說遠小於輸入值的空間,不同的輸入可能會雜湊出相同的輸出(概率很小)。

雜湊函式、演算法

雜湊演算法將任意長度的二進位制值對映為較短的固定長度的二進位制值,這個小的二進位制值稱為雜湊值。雜湊值是一段資料唯一且極其緊湊的數值表示形式。如果雜湊一段明文而且哪怕只更改該段落的一個字母,隨後的雜湊都將產生不同的值。要找到雜湊為同一個值的兩個不同的輸入,在計算上是不可能的,所以資料的雜湊值可以檢驗資料的完整性。一般用於快速查詢和加密演算法 ---《資料結構與演算法分析》

1.什麼是hash

hash是一種演算法,該演算法接受傳入的內容,經過運算得到一串hash值

1.如果把hash演算法比喻為一座工廠

2.那傳給hash演算法的內容就是原材料

3.生成的hash值就是生產出的產品

2.為何要用hash演算法

hash值/產品有三大特性:

1.只要傳入的內容一樣,得到的hash值必然一樣

2.只要我們使用是hash演算法固定,無論傳入的內容有多大,得到的hash值的長度是固定

3.不可以用hash值逆推出原來的內容

基於1和2可以在下載檔案時做檔案一致性校驗

基於1和3可以對密碼進行加密

雜湊表

散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的

資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表

特點

  • 如果兩個雜湊值是不相同的(根據同一函式),那麼這兩個雜湊值的原始輸入一定是不相同的。
  • 如果兩個雜湊值相同,兩個輸入值很可能(極大概率)是相同的,但也可能不同,這種情況稱為“雜湊碰撞”
  • 抗篡改能力:對於一個數據塊,哪怕只改動其一個位元位,其hash值的改動也會非常大。
  • 它是一種單向函式是“非對稱”的,即它是一個從明文到密文的不可逆的對映,只有加密過程,沒有解密過程。

python中應用 Hash 加密

import hashlib

兩種傳值方式:

    1.造出hash工廠

    m=hashlib.md5()                      #hashlib.sha512 :可以選擇不同的演算法加密,不同的演算法的加密結果的長度也會不一樣

    2.運送原材料

    m.update('你好啊’.encode('utf-8'))

    3.產出hash值

    print(m.hexdigest)

    

1.

   1.造出hash工廠

    m=hashlib.md5(''.encode('utf-8'))

 

   2.運送原材料

    m.update('你好啊’.encode('utf-8'))

    3.產出hash值

    print(m.hexdigest)

 

應用一:檔案一致性校驗

 

    1.造出hash工廠

    m=hashlib.md5()

    2.運送原材料

     with open(r'E:\01.mp4','rb') as f:
         for line in f:

             m.update(line)

    3.產出hash值

    print(m.hexdigest)

 

應用二:密碼加密

    m=hashlib.md5()

    m.update('天王蓋地虎'.encode('utf-8'))      #添加個暗號,提升密碼複雜度
    m.update(password.encode('utf-8'))
    print(m.hexdigest()) 

 

加密模組另一個加密模組 hmac

import hmac

m=hmac.new('小雞燉蘑菇'.encode('utf-8')) #用法跟hash一樣的用法,但必須要傳個值,增加密碼難度性
m.update('hello'.encode('utf-8'))
print(m.hexdigest())

 

Hash 並不是不能反向解析。。。。。