本文介紹了布隆過濾器的概念及變體,這種描述很是適合代碼模擬實現。重點在於標準布隆過濾器和計算布隆過濾器,其餘的大都在此基礎上優化。文末附上了標準布隆過濾器和計算布隆過濾器的代碼實現(Java版和Python版)node
本文內容皆來自 《Foundations of Computers Systems Research》一書,本身翻譯的,轉載請註明出處,不許確的部分請告知,歡迎討論。算法
分佈式哈希表是一個基本的結構,被普遍的應用在許多分佈式系統中,用於組織動態改變的(分佈式)節點集合和透明的資源定位服務,如,DHT 在許多 P2P 系統中做爲一個基本結構提供高效透明的資源定位服務。全部節點都同等重要,這使得 DHT 更加的裝載平橫。並且,在 DHT 中具備必定規律的拓撲結構(環、樹、超立方體、網格、蝴蝶形……),這使得查找更加的高效。雖然,各類 DHT 實現的拓撲結構各不相同,但它們至少提供如下兩個基本的功能:
DHT 網絡設計的重點大多在如下幾個方面:
|
DHTs | Topology | Node Degree | Routing Hops |
CAN | mesh | O(d) | O(dn^(1/d)) |
Chord | ring | O(logn) | O(logn) |
Pastry | tree + ring | O(logn) | O(logn) |
Tapestry | tree | O(logn) | O(logn) |
Kademlia | tree | O(logn) | O(logn) |
Viceroy | butterfly | 7 | O(logn) |
Koord | de Bruijn graph + ring | 2 or O(logn) | O(logn) or O(logn/loglogn) |
Cycloid | hypecube + ring | 3 | O(d) with n = d2^d |
Chord 的拓撲結構
拓撲結構如右圖。N14 節點負責存儲標識符爲(9,10,11,12,13,14)的鍵
|
|
Chord 的查找算法 如果使用普通的遍歷查找,那麼每一個節點的度爲1(只有後繼),查找的時間複雜度爲log(n)。而 chord 在節點度數和時間複雜度之間作了個折中:增長節點的度,減小查找時間。 每一個節點都有一個 finger table,該表有 m 個條目,每一個條目指向另外的節點。條目指向的節點計算公式爲:(n + 2^k) % 2^m 。(n 爲當前節點的標識符,m 是標識符空間的位數,0 <= k < m)。如右圖。 爲何要設置這樣一個指向表呢?爲了更快的查找。假設如今咱們要從節點 n 開始,查找標識符 id。因而有以下的步驟:
|
|
在分佈式系統中,會常常的進行節點的動態加入和離開,並且節點也可能出問題,因此還須要考慮節點的動態維護,一些算法就要週期的執行來維護拓撲結構。舉一個例子,節點 N26 加入該網絡:併發
|
案例一:協同域名系統(Cooperative Domain Name System,CoDoNS) |
案例二:協同文件系統(Cooperative File System,CFS) |