我正在学习和弦系统。但我对它的查询算法有疑问。为什么和弦中的手指表只存储successor(n+2^{i-1})
的信息,而不是环中所有其他节点的信息?如图所示,
如果我想在节点1搜索密钥7.如果节点1存储了环上节点的所有地址,因为我们显然知道7的后继是0,我们可以直接到0.我为什么要去节点6首先使用节点6路由到0.我有点困惑。
答案 0 :(得分:3)
可扩展性。想象一下,环中有10,000,000个节点。跟踪所有这些变得非常困难(由于内存限制以及信令和处理节点连接/离开所需的通信工作)。
相反,您可以利用节点ID在环中排序的事实。然后你可以使用它们来避免在整个环上进行线性搜索。例如:在节点0中,您只存储大约9个节点的信息(假设ID为0到10,000,000):1,000,000,2,000,000,3,000,000,...和9,000,000。然后,如果您想要到达一个随机节点,比如1,337,000,您只需要在1,000,000到2,000,000的段中搜索。因此,通过存储大约9个节点的信息,您可以将工作量减少10倍。
但你可以做得更好。如果节点1,000,000,1,000,001等使用与节点0相同的快捷方式,那么从1,000,000到1,337,000仍需要很多工作(337,000步),彼此之间的间隔为1,000,000。如果从节点0开始以1M的间隔间隔9个快捷方式,那么不是很好吗,但是从节点1M到2M的间隔为100k的9个快捷方式也不是很好吗?然后你必须在段1,300,000到1,400,000中进行查找。
你可以通过让每个节点以10k的间隔为节点维护9个快捷方式,以及以1k的间隔等为另外9个节点保持9个快捷方式来进一步实现这一点。
因此,总而言之,查找将如下工作:
所以你只用了4步就得到了答案。让我们看一下手指表中需要多少存储空间。
任何id为n的节点都需要存储以下信息:
因此每个节点只需要存储大约54个其他节点的信息。在最坏的情况下,您需要6 + 9 = 15次查找才能到达节点。这比没有手指表所需的10M-1查找要好得多。
Chord使用base 2而不是base 10来分割环。因此,你在论文中看到了2而不是10的权力。
我不记得这是否正是和弦的作用方式;但这是一样的想法。分布式二进制搜索。