分布式雜湊表

2021-07-01 20:22:00 字數 1941 閱讀 7839

我們從淺入深一步一步介紹什麼是分布式雜湊表。

1、雜湊函式

雜湊函式是一種計算方法,它可以把乙個值a對映到乙個特定的範圍[begin, end]之內。對於乙個值的集合,雜湊函式把他們均勻的對映到某個範圍之中。這樣,通過這些值就可以很快的找到與之對應的對映位址。對於同乙個值,雜湊函式要能保證對這個值的運算結果總是相同的。

雜湊函式需要經過精心設計才能夠達到比較好的效果,但是總是無法達到理想的效果。多個值也許會對映到同樣的位址上。這樣就會產生衝突,如圖中的紅線所示。在設計雜湊函式時要儘量減少衝突的產生。

最簡單的雜湊函式就是乙個求餘運算:  hash(a) = a % n。這樣就把a這個值對映到了[0~n-1]這樣乙個範圍之中。

2、雜湊表

雜湊表的核心就是雜湊函式hash()。

雜湊表是一中資料結構,它把key 和 value用某種方式對應起來。使用hash()函式把乙個key值對映到乙個index上,即hash(key) = index。這樣就可以把乙個key值同某個index對應起來。然後把與這個key值對應的value儲存到index所標記的儲存空間中。這樣,每次想要查詢key所對應的value值時,只需要做一次hash()運算就可以找到了。

舉個例子:圖書館中的書會被某人借走,這樣「書名」和「人名」之間就形成了key與value的關係。假設現在有三個記錄:

鋼鐵是怎樣煉成的

小明最後一天

小紅變形記小紅

這就是「書名」和「人名」的對應關係,它表示某人借了某本書。現在我們把這種對應關係用雜湊表儲存起來,它們的hash()值分別為:

hash(鋼鐵是怎樣煉成的) = 2

hash(最後一天) = 0

hash(變形記) = 1

然後我們就可以在乙個表中儲存「人名」了:0小紅

1小紅2小明

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

當有大量的key value對應關係的資料需要儲存時,這種方法就非常有效。

3、分布式雜湊表

雜湊表把所有的東西都儲存在一台機器上,當這台機器壞掉了之後,所儲存的東西就全部消失了。分布式雜湊表可以把一整張雜湊表分成若干個不同的部分,分別儲存在不同的機器上,這樣就降低了資料全部被損壞的風險。

分布式雜湊表通常採用一致性雜湊函式來對機器和資料進行統一運算。這裡先不用深究一致性雜湊究竟是什麼,只需要知道它是對機器(通常是其ip位址)和資料(通常是其key值)進行統一的運算,把他們全都對映到乙個位址空間中。假設有乙個一致性雜湊函式可以把乙個值對映到32bit的位址空間中,從0一直到2^32 – 1。我們用乙個圓環來表示這個位址空間。

假設有n臺機器,那麼hash()就會把這n臺機器對映到這個環的n個地方。然後我們把整個位址空間進行一下劃分,使每台機器控制乙個範圍的位址空間。這樣,當我們向這個系統中新增資料的時候,首先使用hash()函式計算一下這個資料的index,然後找出它所對應的位址在環中屬於哪個位址範圍,我們就可以把這個資料放到相應的機器上。這樣,就把乙個雜湊表分布到了不同的機器上。如下圖所示:

這裡藍色的圓點表示機器,紅色的圓點表示某個資料經過hash()計算後所得出的位址。

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

圖中的虛線表示資料會儲存在哪台機器上。

分布式雜湊表

我們從淺入深一步一步介紹什麼是分布式雜湊表。1 雜湊函式 雜湊函式是一種計算方法,它可以把乙個值a對映到乙個特定的範圍 begin,end 之內。對於乙個值的集合,雜湊函式把他們均勻的對映到某個範圍之中。這樣,通過這些值就可以很快的找到與之對應的對映位址。對於同乙個值,雜湊函式要能保證對這個值的運算...

分布式雜湊表

編輯 收藏我們從淺入深一步一步介紹什麼是分布式雜湊表。1 雜湊函式 雜湊函式是一種計算方法,它可以把乙個值a對映到乙個特定的範圍 begin,end 之內。對於乙個值的集合,雜湊函式把他們均勻的對映到某個範圍之中。這樣,通過這些值就可以很快的找到與之對應的對映位址。對於同乙個值,雜湊函式要能保證對這...

分布式雜湊表的應用

dht在p2p理論研究和應用上具有重要的作用,是現在大多數p2p系統實現管理資料的基本理論,不同的應用系統區別只是實現方法上的不同。根據具體的應用比如 即時聊天系統可能考慮更多的是延遲的問題,所以可能在路由演算法上要考慮盡可能高效,實現在一跳或者2跳找到目標點,但是這可能要以犧牲點的靈活和可擴性。網...