5 个版本 (3 个稳定版)
1.2.0 | 2019年10月27日 |
---|---|
1.1.0 | 2018年11月1日 |
1.0.0 | 2018年10月6日 |
0.2.0 | 2018年4月12日 |
0.1.0 | 2018年4月5日 |
#619 in 并发
46KB
885 行
kademlia-dht-rs
kademlia-dht-rs 是 Kademlia 分布式哈希表的灵活实现。这个库主要创建来更好地理解 Rust 并发原语。这个实现相当接近原始 Kademlia 论文中描述的规范,除了少数设计考虑。
示例
extern crate kademlia_dht;
extern crate sha3;
use kademlia_dht::{Key, Node};
use sha3::{Digest, Sha3_256};
use std::thread;
use std::time::Duration;
fn clone_into_array<A, T>(slice: &[T]) -> A
where
A: Sized + Default + AsMut<[T]>,
T: Clone,
{
let mut a = Default::default();
<A as AsMut<[T]>>::as_mut(&mut a).clone_from_slice(slice);
a
}
fn get_key(key: &str) -> Key {
let mut hasher = Sha3_256::default();
hasher.input(key.as_bytes());
Key(clone_into_array(hasher.result().as_slice()))
}
fn main() {
let mut node = Node::new("localhost", "8080", None);
let key = get_key("Hello");
let value = "World";
node.insert(key, value);
// inserting is asynchronous, so sleep for a second
thread::sleep(Duration::from_millis(1000));
assert_eq!(node.get(&key).unwrap(), value);
}
使用方法
将以下内容添加到你的 Cargo.toml
[dependencies]
kademlia-dht = "*"
如果你的 Rust 版本是 2015,请将以下内容添加到 crate 根目录
extern crate kademlia_dht;
设计考虑
- 由于优化复杂且收益有限,许多论文中的原始优化并未实现。
- 每个节点的路由表使用可增长向量来表示 k-bucket 的二叉树。当最接近节点 ID 的 k-bucket 超出容量时,向量会增长。第 4.2 节中提出的 k-bucket 分割放宽并未实现。
- 第 2.5 节中描述的缓存和键重新发布未实现,以简化移动部件和活动线程的数量。确保键被重新发布是库用户的责任。
- 节点递归查找使用严格的并行性来紧密限制活动 RPC 的数量,而不是论文中暗示的松散并行性。
- 每个键是 256 位,而不是 160 位,以便消费者可以使用 SHA-3 而不是 SHA-1。
变更日志
有关更多详细信息,请参阅 CHANGELOG
参考文献
- Kademlia:基于 XOR 度量的对等信息系统
Maymounkov, Petar,和 David Mazières。2002。“Kademlia:基于 XOR 度量的对等信息系统。”在《第一国际对等系统研讨会修订论文》中,第 53-65 页。IPTPS '01。伦敦,英国:Springer-Verlag。 http://dl.acm.org/citation.cfm?id=646334.687801。
许可证
kademlia-dht-rs
根据 MIT 许可证或 Apache 许可证(版本 2.0)的双重许可证。
有关更多详细信息,请参阅 LICENSE-APACHE 和 LICENSE-MIT
依赖关系
~5.5MB
~86K SLoC