1 个不稳定版本
0.0.1 | 2024年2月4日 |
---|
#10 在 #hyper-log-log
6,977 每月下载次数
17KB
350 行
simple_hll −
simple_hll
是一个简单的 Rust HyperLogLog 实现。它设计得易于使用,且存储字节更少(使用稀疏 HyperLogLog)。
快速开始
use simple_hll::HyperLogLog;
let mut hll = HyperLogLog::<14>::new();
hll.add_object("hello");
hll.add_object("world");
hll.add_object("simple_hll");
println!("cardinality: {}", hll.count());
Serde
simple_hll
支持 serde 和 borsh,通过启用 serde_borsh
功能,您可以对 HyperLogLog 实例进行序列化和反序列化。
let val = serde_json::to_vec(hll)?;
注意,为了减少序列化大小,我们引入了一个稀疏中间结构来表示 HyperLogLog 实例。当非零寄存器的数量小于一个阈值时,我们将使用稀疏模式来序列化 HyperLogLog 实例。
enum HyperLogLogVariant<const P: usize> {
Empty,
Sparse { data: Vec<(u16, u8)> },
Full(Vec<u8>),
}
无固定类型
与其他 hyperloglog 实现不同,我们不使用固定类型 HyperLogLog<T>
来表示 HyperLogLog 实例,而是使用 const 泛型参数来指定精度。精度 P
是用于寄存器索引的位数。寄存器的数量是 2^P
。精度 P
是准确性和内存使用之间的权衡。默认精度为 14,这意味着内存使用大约为 16KB。
原因是我们在 databend 或其他 dbms 中会存储 HyperLogLog
在元数据中。我们不希望使用 HyperLogLog<Datum>
,以便简化并减少对枚举进行哈希的开销。
贡献
查看 CONTRIBUTING.md 指南以获取有关开始为此项目做出贡献的更多详细信息。
致谢
一些代码和测试借鉴和受到以下项目的启发:
参考论文
感谢作者和贡献者的出色工作。
许可证
在 Apache 许可证,版本 2.0 下许可。依赖
~0.6–1.2MB
~19K SLoC