对于每个节点,有两个函数,findSuccessor和nearestPrecedingNode,它们作为伪代码给出.
findSuccessor是:
n.findSuccessor(id) if(id is.in (n, successor]) return successor; else n' = closestPrecedingNode(id); return n'.findSuccessor(id);
nearestPrecedingNode是:
n.closestPrecedingNode(id) for i = m downto 1 if(finger[i] is.in (n, id)) return finger[i]; return n;
创建节点时,其后继节点最初设置为节点本身,其指针表为空.
现在我的问题是当只有一个节点时会发生什么,并且除了它自己的id之外,还要求任何id.然后findSuccessor运行else块并调用nearestPrecedingNode.由于finger表是空的,因此节点本身返回findSuccessor.因此n’等于n.
然后,在n’上调用findSuccessor,这是对自身的递归调用.
然后我们有一个无限循环…或者我错过了什么?
注意:伪代码取自第5页的Chord: A Scalable Peer-to-peer Lookup Protocol
for Internet Applications.
if (this == successor) { return this; }
但似乎有更优雅的解决方案,更接近伪代码.当检查ID是否在间隔(n,后继者)中(左边排除,右边包括)时,使该检查循环.jDHTUQ似乎这样做(从第75行开始.警告:真的很丑的代码):
http://jdhtuq.svn.sourceforge.net/viewvc/jdhtuq/source_code/distributed_lookup_service/LookupService/src/co/edu/uniquindio/utils/hashing/Key.java?revision=63&view=markup
恕我直言以循环方式执行间隔检查似乎是正确的做法.您链接的论文(第4页):
The notation (a; b] denotes the segment of the Chord ring obtained by moving clockwise from (but not including) a until reaching (and including) b.
如果是单个节点,您将检查是否
id is.in (n, n]
应该产生真值,因为id在n之后开始并以n结束的环内.