分佈式哈希表

咱們從淺入深一步一步介紹什麼是分佈式哈希表。html

 

一、哈希函數數據結構

     哈希函數是一種計算方法,它能夠把一個值A映射到一個特定的範圍[begin, end]以內。對於一個值的集合{k1, k2, … , kN},哈希函數把他們均勻的映射到某個範圍之中。這樣,經過這些值就能夠很快的找到與之對應的映射地址{index1, index2, … , indexN}。對於同一個值,哈希函數要能保證對這個值的運算結果老是相同的。分佈式

image

     哈希函數須要通過精心設計纔可以達到比較好的效果,可是老是沒法達到理想的效果。多個值也許會映射到一樣的地址上。這樣就會產生衝突,如圖中的紅線所示。在設計哈希函數時要儘可能減小衝突的產生。函數

     最簡單的哈希函數就是一個求餘運算:  hash(A) = A % N。這樣就把A這個值映射到了[0~N-1]這樣一個範圍之中。spa

 

二、哈希表設計

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

     哈希表是一中數據結構,它把KEY 和 VALUE用某種方式對應起來。使用hash()函數把一個KEY值映射到一個index上,即hash(KEY) = index。這樣就能夠把一個KEY值同某個index對應起來。而後把與這個KEY值對應的VALUE存儲到index所標記的存儲空間中。這樣,每次想要查找KEY所對應的VALUE值時,只須要作一次hash()運算就能夠找到了。blog

     舉個例子:圖書館中的書會被某人借走,這樣「書名」和「人名」之間就造成了KEY與VALUE的關係。假設如今有三個記錄:ci

鋼鐵是怎樣煉成的 小明
最後一天 小紅
變形記 小紅

      這就是「書名」和「人名」的對應關係,它表示某人借了某本書。如今咱們把這種對應關係用哈希表存儲起來,它們的hash()值分別爲:get

hash(鋼鐵是怎樣煉成的) = 2
hash(最後一天) = 0
hash(變形記) = 1

      而後咱們就能夠在一個表中存儲「人名」了:

0 小紅
1 小紅
2 小明

      這三我的名分別存儲在0、1和2號存儲空間中。當咱們想要查找《鋼鐵是怎樣煉成的》這本書是被誰借走的時候,只要hash()一下這個書名,就能夠找到它所對應的index,爲2。而後在這個表中就能夠找到對應的人名了。在這裏,KEY爲「書名」, VALUE爲「人名」。

      當有大量的KEY VALUE對應關係的數據須要存儲時,這種方法就很是有效。

 

三、分佈式哈希表

      哈希表把全部的東西都存儲在一臺機器上,當這臺機器壞掉了以後,所存儲的東西就所有消失了。分佈式哈希表能夠把一整張哈希表分紅若干個不一樣的部分,分別存儲在不一樣的機器上,這樣就下降了數據所有被損壞的風險。

      分佈式哈希表一般採用一致性哈希函數來對機器和數據進行統一運算。這裏先不用深究一致性哈希到底是什麼,只須要知道它是對機器(一般是其IP地址)和數據(一般是其KEY值)進行統一的運算,把他們全都映射到一個地址空間中。假設有一個一致性哈希函數能夠把一個值映射到32bit的地址空間中,從0一直到2^32 – 1。咱們用一個圓環來表示這個地址空間。

image

      假設有N臺機器,那麼hash()就會把這N臺機器映射到這個環的N個地方。而後咱們把整個地址空間進行一下劃分,使每臺機器控制一個範圍的地址空間。這樣,當咱們向這個系統中添加數據的時候,首先使用hash()函數計算一下這個數據的index,而後找出它所對應的地址在環中屬於哪一個地址範圍,咱們就能夠把這個數據放到相應的機器上。這樣,就把一個哈希表分佈到了不一樣的機器上。以下圖所示:

image

      這裏藍色的圓點表示機器,紅色的圓點表示某個數據通過hash()計算後所得出的地址。

      在這個圖中,按照逆時針方向,每一個機器佔據的地址範圍爲從本機器開始一直到下一個機器爲止。用順時針方向來看,每一個機器所佔據的地址範圍爲這臺機器以前的這一段地址空間。

      圖中的虛線表示數據會存儲在哪臺機器上。

 

轉自:http://www.cnblogs.com/wangshuo/archive/2011/11/26/2264404.html

相關文章
相關標籤/搜索