在Kademlia论文中,第2.4节的最后一段说明为了妥善处理高度不平衡的树木......
Kademlia节点将所有有效联系人保留在大小至少为k个节点的子树中,即使这需要拆分节点自己的ID不驻留的桶.
然而,本文的前一部分似乎表明,如果一个k-bucket已经有k个元素,那么对该k-bucket的任何进一步添加都需要删除最旧的节点(首先ping它以查看它是否存活)或以其他方式缓存添加直到该k-bucket中的插槽可用.
这篇论文似乎与这两点相矛盾.
在什么条件下应该拆分k-bucket以及为什么?将"所有有效联系人"保留在路由表中似乎不切实际,因为路由表会非常快速地变得非常大.该示例讨论了一个树,其中有许多以001开头的节点和一个以000开头的节点.以000开头的节点必须不断地将其k-bucket拆分为001以保存从001开始的每个有效节点?在一个160位的地址空间中,最终是否可能在000的路由表中存储2 ^ 157个节点?
引用块中的措辞也很混乱......
"在子树中" - 路由表的子树?
"大小为至少k个节点" - 我们使用什么度量来确定子树的大小?在这种情况下,节点是指kademlia节点还是k-buckets或其他?
现在我正在使用spring remoting的RMI/SOAP/JMS/Hessian/Burlap/HttpInvoker出口商公开我的应用程序的服务层.我想要的是允许用户以某种方式定义他们想要启用哪些远程处理机制(而不是启用所有这些),然后只创建那些导出器bean.
我希望spring的应用程序上下文xml支持在xml的部分区域内放置条件块.然而,从我到目前为止看到的标准弹簧分布中没有任何东西可以让你做这样的事情.
有没有其他方法可以实现我想要做的事情?
下面的代码在 g++-11.3 下使用编译--std=c++20 -D_GLIBCXX_DEBUG并执行时,会产生有关迭代器的奇怪运行时错误。range我不太确定这意味着什么,但我怀疑它与返回时超出范围的向量有关test():range没有被移动或复制,而是无论管道运算符返回什么,都只保留对range.
#include <ranges>
#include <unordered_set>
#include <vector>
auto to_unordered_set(auto && range) {
using r_type = std::ranges::range_value_t<decltype(range)>;
auto common = range | std::views::common;
return std::unordered_set<r_type>(std::ranges::begin(common), std::ranges::end(common));
}
auto test() {
std::vector<int> range {1,2,3,4,5};
return range | std::ranges::views::transform([](auto x) { return x%2; });
}
int main() {
auto y = to_unordered_set(test());
return 0;
}
/*
/opt/compiler-explorer/gcc-11.3.0/include/c++/11.3.0/debug/safe_iterator.h:195:
In function:
__gnu_debug::_Safe_iterator<_Iterator, _Sequence,
_Category>::_Safe_iterator(__gnu_debug::_Safe_iterator<_Iterator,
_Sequence, _Category>&&) [with _Iterator =
__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int,
std::allocator<int> …Run Code Online (Sandbox Code Playgroud)