1 个不稳定版本

0.0.1 2024年2月4日

#10#hyper-log-log

Download history 1515/week @ 2024-04-20 1243/week @ 2024-04-27 1890/week @ 2024-05-04 2923/week @ 2024-05-11 2053/week @ 2024-05-18 1748/week @ 2024-05-25 2050/week @ 2024-06-01 1527/week @ 2024-06-08 1274/week @ 2024-06-15 1982/week @ 2024-06-22 2278/week @ 2024-06-29 2197/week @ 2024-07-06 1470/week @ 2024-07-13 1782/week @ 2024-07-20 1580/week @ 2024-07-27 1739/week @ 2024-08-03

6,977 每月下载次数

Apache-2.0

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