關於“哈希”、“哈希函數”、“哈希算法”

哈希是一種加密算法

哈希函數(Hash Function),也稱爲散列函數或雜湊函數。哈希函數是一個公開函數,可以將任意長度的消息M映射成爲一個長度較短且長度固定的值H(M),稱H(M)爲哈希值、散列值(Hash Value)、雜湊值或者消息摘要(Message Digest)。它是一種單向密碼體制,即一個從明文到密文的不可逆映射,只有加密過程,沒有解密過程。

它的函數表達式爲:h=H(m)

無論輸入是什麼數字格式、文件有多大,輸出都是固定長度的比特串。以比特幣使用的Sh256算法爲例,無論輸入是什麼數據文件,輸出就是256bit。

每個bit就是一位0或者1,256bit就是256個0或者1二進制數字串,用16進制數字表示的話,就是多少位呢?

16等於2的4次方,所以每一位16進制數字可以代表4位bit。那麼,256位bit用16進制數字表示,當然是256除以4等於64位。

於是你通常看到的哈希值,就是這樣的了:

00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab07888b21eeba8。

這是從btc.com上隨便拷貝的一個哈希值,不放心的話你可以數一下,是不是64位~

Hash函數的特點

Hash函數具有如下特點。

易壓縮:對於任意大小的輸入x,Hash值的長度很小,在實際應用中,函數H產生的Hash值其長度是固定的。

易計算:對於任意給定的消息,計算其Hash值比較容易。

單向性:對於給定的Hash值,要找到使得在計算上是不可行的,即求Hash的逆很困難。在給定某個哈希函數H和哈希值H(M)的情況下,得出M在計算上是不可行的。即從哈希輸出無法倒推輸入的原始數值。這是哈希函數安全性的基礎。

抗碰撞性:理想的Hash函數是無碰撞的,但在實際算法的設計中很難做到這一點。

有兩種抗碰撞性:一種是弱抗碰撞性,即對於給定的消息,要發現另一個消息,滿足在計算上是不可行的;另一種是強抗碰撞性,即對於任意一對不同的消息,使得在計算上也是不可行的。

高靈敏性:這是從比特位角度出發的,指的是1比特位的輸入變化會造成1/2的比特位發生變化。消息M的任何改變都會導致哈希值H(M)發生改變。即如果輸入有微小不同,哈希運算後的輸出一定不同。

哈希算法

把網址A,轉換成數字1。網址B,轉換成數字2。

一個網址X,轉換成數字N,根據數字N作爲下標,就可以快速地查找出網址X的信息。這個轉換的過程就是哈希算法。

比如這裏有一萬首歌,給你一首新的歌X,要求你確認這首歌是否在那一萬首歌之內。

無疑,將一萬首歌一個一個比對非常慢。但如果存在一種方式,能將一萬首歌的每首數據濃縮到一個數字(稱爲哈希碼)中,於是得到一萬個數字,那麼用同樣的算法計算新的歌X的編碼,看看歌X的編碼是否在之前那一萬個數字中,就能知道歌X是否在那一萬首歌中。

作爲例子,如果要你組織那一萬首歌,一個簡單的哈希算法就是讓歌曲所佔硬盤的字節數作爲哈希碼。這樣的話,你可以讓一萬首歌“按照大小排序”,然後遇到一首新的歌,只要看看新的歌的字節數是否和已有的一萬首歌中的某一首的字節數相同,就知道新的歌是否在那一萬首歌之內了。

參考:https://www.sohu.com/a/232586831_100078137

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章