#hash-ring #consistent-hashing #ring #consistent #hash #distributed #virtual-nodes

hulahoop

支持虚拟节点的有效一致性哈希环实现

2 个不稳定版本

0.2.0 2022 年 10 月 29 日
0.1.0 2022 年 10 月 8 日

#1808算法

MIT/Apache

27KB
427

Hulahoop GitHub Workflow Status docs.rs Crates.io

一个快速且高效的一致性哈希实现,支持虚拟节点。


用法

    use hulahoop::HashRing;

    let mut ring: HashRing<&str, _> = HashRing::default();

    // Nodes only need to implement Hash
    // Provide a weight to define the number of virtual nodes
    ring.insert("10.0.0.1:1234", 10);
    ring.insert("10.0.0.2:1234", 10);

    // Keys also only need to implement Hash
    assert_eq!(ring.get("Some key"), Some(&"10.0.0.1:1234"));
    assert_eq!(ring.get("Another key"), Some(&"10.0.0.2:1234"));

    ring.remove(&"10.0.0.2:1234");

    assert_eq!(ring.get("Some key"), Some(&"10.0.0.1:1234"));
    assert_eq!(ring.get("Another key"), Some(&"10.0.0.1:1234"));

HashRing 在内部使用 Arc 仅对每个节点分配内存,而不是通过权重参数添加的每个虚拟节点。

HashringSend + Sync.


哈希函数

默认情况下,hulahoop 使用 std::collections::hash_map::DefaultHasher 进行哈希值。

可以使用 HashRing::with_hasher() 方法使用自定义哈希函数

    use rustc_hash::FxHasher;
    let mut ring: HashRing<&str, _> = HashRing::with_hasher(BuildHasherDefault::<FxHasher>::default());

为了方便,可以通过激活此包的 fxhash 功能来使用更快的哈希函数 FxHasher


基准测试

DefaultHasher FxHasher (feature=fxhash)
获取(键长度 = 10) 13ns 8ns
获取(键长度 = 100) 31ns 12ns
获取(键长度 = 1000) 305ns 137ns
添加(权重 = 1) 290ns 210ns
添加(权重 = 10) 1.4us 1.0us
添加(权重 = 100) 17.0us 14.3us

许可证

此项目可以选择性地根据以下任一许可证进行许可

依赖项