本文介绍了布隆过滤器的概念及变体,这种描述很是适合代码模拟实现。重点在于标准布隆过滤器和计算布隆过滤器,其余的大都在此基础上优化。文末附上了标准布隆过滤器和计算布隆过滤器的代码实现(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) |