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 并发

MIT/Apache

46KB
885

kademlia-dht-rs

Documentation License: MIT License: Apache 2.0 Build Status codecov

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-dht-rs 根据 MIT 许可证或 Apache 许可证(版本 2.0)的双重许可证。

有关更多详细信息,请参阅 LICENSE-APACHELICENSE-MIT

依赖关系

~5.5MB
~86K SLoC