我正在实现内部集群的自己的dht。由于它将用于像比特洛克一样的文件共享程序,所以“Mainline DHT”是我首先看到的东西。之后我发现了“entangled”(使用扭曲矩阵的Python,dht),国会(使用pyev + libev的Python,dht)和当然原始的“kademlia”。
它们在组织k-buckets方面有不同的方法:
1)congress,kademlia在范围2 * i <=(与我们每个id的差异)<2 *(i + 1),对于0 <= i <160使用固定的160个桶。
2)主线DHT和entangled使用动态桶。开始时,它们只有一个覆盖整个空间的桶。在填满8个活动节点后,该桶将被分成2个新桶。但仅当我们自己的id在该桶中时。如果不是-桶将永远不会分裂。因此,很快我们将拥有160个最接近我们的桶和其他几个。
这两个变体都足够好。但我发现在检测某个id是否属于某个桶中存在巨大差异。这就是我的问题。
国会和kademlia将bucket bundaries视为“距离我们的最小距离”和“距离我们的最大距离”。因此,我们自己的ID将始终在bucket0中。桶1中的最多2个其他ID(因为它覆盖了2 * 1 <= x <2 * 2距离)将始终最接近我们。所以我的大脑不会崩溃,因为一切都很好。
但是,如果您查看Mainline DHT或entangled,则会发现bucket bundaries被视为绝对节点ID bundaries,而不是异或距离!因此,在理论上完整的表格ids 0,1,2,3,4,5,6,7将在1个bucket中。
那么。为什么有些实现将bucket boundaries视为“max / min distance from us”,而其他实现将其视为“max / min 160bit integer value”?
它们在组织k-buckets方面有不同的方法:
1)congress,kademlia在范围2 * i <=(与我们每个id的差异)<2 *(i + 1),对于0 <= i <160使用固定的160个桶。
2)主线DHT和entangled使用动态桶。开始时,它们只有一个覆盖整个空间的桶。在填满8个活动节点后,该桶将被分成2个新桶。但仅当我们自己的id在该桶中时。如果不是-桶将永远不会分裂。因此,很快我们将拥有160个最接近我们的桶和其他几个。
这两个变体都足够好。但我发现在检测某个id是否属于某个桶中存在巨大差异。这就是我的问题。
国会和kademlia将bucket bundaries视为“距离我们的最小距离”和“距离我们的最大距离”。因此,我们自己的ID将始终在bucket0中。桶1中的最多2个其他ID(因为它覆盖了2 * 1 <= x <2 * 2距离)将始终最接近我们。所以我的大脑不会崩溃,因为一切都很好。
但是,如果您查看Mainline DHT或entangled,则会发现bucket bundaries被视为绝对节点ID bundaries,而不是异或距离!因此,在理论上完整的表格ids 0,1,2,3,4,5,6,7将在1个bucket中。
那么。为什么有些实现将bucket boundaries视为“max / min distance from us”,而其他实现将其视为“max / min 160bit integer value”?