區塊鏈基礎-哈希(hash)是啥

如果你從事編程,或者對區塊鏈感興趣,那麼哈希這個詞肯定經常聽到,那麼哈希到底是什麼,今天就簡單聊一聊。

首先我有一個算法,有一個輸入和一個輸出,換句話說當你輸入一個數據,我返回給你一個數據。我們假定一下我的算法是 +1,然後算法的輸入和輸出都是數字,當你輸入一個數字時,我返回給你一個數字,那麼根據我這個算法,我們就知道,當你輸入一個數字時,輸出的一定是另外一個數字,因為我輸出的數字是在你的基礎上加一,而且我們也知道沒有最大的數字(不考慮計算機能使用的最大數值),這樣就有一個明顯的特點:輸入的數據不同,輸出的數據一定不同。

這只是哈希的一個特點,並且我上面的例子並不是非常確定,首先上面的例子,當我知道輸出的數據是什麼的時候,我可以推算出輸入的數據是什麼。這樣是非常不安全的,如果哈希算法是這樣,那麼也就沒有用了。那麼下一個特點就出來了:根據輸出結果,不能計算出輸入結果。就是說在上一個特點的基礎上,我們不僅讓輸出的數據唯一,而且輸出的數據不能在推算出輸入數據。

在我們第一個例子中,我們輸出的數字大小是無限的,也就是說,輸出的數據的長度不是固定的,而且是根據你輸入的數據來改變的。這也不是我們想要的。那麼另外一個特點就出來了:

輸出的數據是固定長度。舉個例子,在之前的例子中,我們輸入1,輸出2,輸入10,輸出11。在保持新的特點時,就可能是這樣,輸入1,輸出:164728798263,輸入2,輸出:875730978359。不僅輸出的數據不固定了,而且長度也固定了。

不知道根據上面的例子大家有沒有發現另外一個特點,當我輸入1和輸入2時,輸出的兩個數據差距非常大,不錯,這也是一個特點:輸入的兩個數據差別不大時,輸出的數據差距非常大。大家可能會想,那我如果輸入兩個差距很大的數據,那麼輸出的差別是不是就很小了?當然不是,這個特點主要是說,無論你輸入什麼數據,只要是不同的,輸出的數據肯定不同,而且差別很大。

區塊鏈基礎-哈希(hash)是啥

hash

不知道大家有沒有想過,當我們輸出的數據定長,並差距很大,而且根據輸入數據唯一時,那麼會不會發生碰撞,就是說當我輸入兩個數據時,有沒有可能輸出兩個相同的數據。從數學上來說,這是一定可能發生的,當我們定長時,那麼輸出的數據一定是有限的,假如我們輸出的數據個數是n,那麼當我們輸入了n+1次不同的數據時,那麼肯定有兩個是相同的,這是一定的。但是在現實中這是不可行的,因為如果我們要做n+1次操作的話,如果使用計算機來操作,很有可能是需要幾十年甚至幾百年的。想一下 ipv6,可以讓世界上每一粒沙子都配一個ip,大概就是這個意思了。

怎麼樣,哈希沒有那麼難吧,理解起來非常簡單,但是實現起來就不簡單了,目前有很多的算法:MD4,MD5,SHA 家族等等,都是為了實現哈希,但是 MD5 已經完成碰撞了。好在現在我們不需要實現這個算法了,只需要知道如何使用就可以了,如果想要認識區塊鏈,那麼哈希一定是第一步。


分享到:


相關文章: