#bitmap #set #bounded #performance

lilbits

超快的 u8 集合(即位图),基于元素 <= 63 的假设

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2018年1月16日

#2123数据结构

自定义许可

14KB
244

Lil'Bits

用途

在某些情况下,即使是简单的 HashMap<T> 对于应用程序来说也太多。LilBitsSet 受到 smallsetsparsesetbitmap 等作品的影响,但非常简单,只有一个功能非常出色:当值永远不会 > 63 时,它实现了 HashSet<u8> 的语义。

我个人计划在我的服务器客户端库中使用它,用户可以选择向客户端的 LilBitSet 广播。由于一次最多只有 ~10 个用户在线,因此 LilBitSet 是处理与这些客户端及其对应 ID 相关的对象的完美选择。

实用性

与其他集合相比,这种数据结构有两个严重的限制

  1. 只能存储 u8(或任何可以 as u8 的整数)
  2. 不能存储值 >= 64。这与 smallset 不同,其中限制在于元素的 数量,而不是元素的 。如果这些限制对于您的目的来说是决定性的,则最好使用 smallset 或类似的数据结构。否则,LilBitSet 具有一些出色的特性
  • 超级快的 insert 等基本操作
  • 超级快的 CloneCopy
  • trivially benefits from obvious SizedSyncSerializeDeserialize 等。
  • 依赖于超级快的位操作(例如,union|)的集合逻辑

此外,还有一个便利的宏 lilbits! 用于构建 LilBitSet,以及一些可能有用的 From 实现,用于将其他常见的集合 HashSetBTreeSet 转换为和从 LilBitSet

自行使用

LilBitSet 的语义类似于 HashSet<u8>,只是缺少一些不实用的函数,例如 new_with_capacity

最值得注意的是,如果尝试插入一个大于 63 的 u8 值,线程将 Panic!。如果这种行为不受欢迎,只需用 if 检查来保护它。我避免了自己实现它,因为这只会使 API 扩大。

示例

请参阅 tests.rs 以查看带注释的示例。

依赖项

~0.4–1MB
~24K SLoC