什麼是哈希?為什麼IPFS會用它?

如果聽說過 IPFS 的小夥伴,估計也曾聽說過“哈希”這個詞。在 IPFS 的世界裡,“哈希”是一個不能忽略的詞語,甚至是這套系統的“基石”。

那麼什麼是“哈希”?為什麼在 IPFS 中這麼重要?這東西有什麼用?

什麼是哈希?為什麼IPFS會用它?

首先,我們瞭解一個名詞——分佈式哈希表。

分佈式哈希表(DHT)廣泛用於協調和維護有關點對點系統的元數據。 例如,BitTorrent 、Mainline DHT記錄了torrent群組中的對等節點分組。

什麼是哈希?為什麼IPFS會用它?

通俗一點來說,點對點就是多線程下載,比如說我們要裝滿一桶水,打開兩個水龍頭會比打開一個水龍頭要快(水的流速是一直的哈^_^)這個點對點系統也是一樣的道理,下載的通道越多,速度也就越快了。而且距離越近,速度也越快。不是有句話“遠水救不了近火”,在網絡世界裡,節點與節點之間的距離也是能影響到數據傳輸的速度的。

至於元數據呢,就是描述數據的數據,比如說小編有一張照片,在存儲的世界裡,這張照片就是數據,而元數據就是描述這張照片的一堆類似於“代碼”的東西(具體是什麼我們下次再聊哈,反正元數據就是用來描述文件、照片、音樂、視頻等東西的)。

點對點系統為我們傳輸數據提供了一種新的方式,這種方式就會有相應的存儲方法,這時候,分佈式哈希表就上場了。

什麼是哈希?為什麼IPFS會用它?

哈希表

哈希表的核心就是哈希函數hash。

哈希表其實是一種數據結構,把 KEY 和 VALUE 用某種方式鏈接起來,使之對應。使用 hash() 函數把一個 KEY 值映射到一個 index 上,即hash(KEY) = index。這樣就可以把一個KEY值同某個 index 對應起來。然後把與這個 KEY 值對應的 VALUE 存儲到 index 所標記的存儲空間中。這樣,每次想要查找KEY所對應的VALUE值時,只需要做一次hash()運算就可以找到了。

舉個例子:我們從網站上下載電影,首先我們要知道這部電影在哪個網站上有,這樣“網站”和“電影”之間就形成了 KEY 與 VALUE 的對應關係,它表示某個網站有某部電影。

現在我們把這種對應關係用哈希表存儲起來:有三部電影A、B、C,它們的hash()值分別為:0、1和2號,當我們想要查找A這部電影在哪個網站上的時候,只要 hash()一下這個名字,就可以找到它所在的網站了。

當有大量的這種對應關係的數據需要存儲時,這種方法就非常有效,可以快速檢索。

也正是因為存儲了大量數據,這張哈希表就變得非常重要了,我們能否快速找到所需的數據就看它了。萬一這張表丟失的話,後果也許很嚴重。就像是把所有的東西都存儲在一臺機器上,當這臺機器壞掉了之後,所存儲的東西就全部消失了。

幸好,我們有分佈式哈希表。分佈式哈希表可以把一整張哈希表分成若干個不同的部分,分別存儲在不同的機器上,這樣就降低了數據全部被損壞的風險。

分佈式哈希表

我們知道當一樣東西成為孤品的時候是最珍貴的,因為沒有了就沒有了,所以孤品是萬萬不能丟的。

同樣,數據也是一樣的。我們有了哈希表幫我們快速找到對應的數據,但如果存放這張哈希表的機器發生了故障,就只能含淚說一句:“再見了,我的數據。”

分佈式哈希表把一整張哈希表分成若干部分,存儲在不同的節點上,這樣即使其中一個節點發生故障了,也有其它節點提供存儲信息。

此外,在海量數據面前,分佈式哈希表分散在不同的節點上,這樣我們就可以從距離我們最近的節點處查找到數據,從而獲得更快的傳輸速度。

哈希與 IPFS

目前大熱的 IPFS 就是採用分佈式哈希表作為索引結構的,讓我們在 IPFS上存儲和傳輸數據的時候有更好的體驗。

在 IPFS 這個分佈式的系統中,需要這麼一個東西來幫助節點與節點之間發現彼此的內容,而分佈式哈希表就是一個很不錯的選擇。因為這是一個分佈式的、容錯(和可擴展)的數據結構。節點之間不需要集中協調(每個節點實際上只知道網絡的一小部分),並且通過智能冗餘,即使節點發生故障導致網絡中斷,系統仍然可以運行。最後,因為沒有一個節點必須知道所有密鑰,所以系統可以很好地擴展,並且實際上可以容納數百萬個對等端。

IPFS 是一套由一群技術極客創造出來的系統,裡面含有大量前端技術,今天所講的分佈式哈希表只是其中一種,有興趣瞭解 IPFS 的小夥伴們可以繼續關注我們雲儲網絡^_^


分享到:


相關文章: