2 个不稳定版本
0.2.0 | 2022 年 10 月 29 日 |
---|---|
0.1.0 | 2022 年 10 月 8 日 |
#1808 在 算法 中
27KB
427 行
Hulahoop
一个快速且高效的一致性哈希实现,支持虚拟节点。
用法
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
仅对每个节点分配内存,而不是通过权重参数添加的每个虚拟节点。
Hashring
是 Send + 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 |
许可证
此项目可以选择性地根据以下任一许可证进行许可
- Apache 许可证 2.0 版,(LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 https://opensource.org/licenses/MIT)