#key-value #map #key #table #key-index #value #byte-array

无需 std smallmap

小型字节大小的泛型键值映射类型

18 个稳定版本

1.4.2 2023 年 10 月 24 日
1.4.1 2022 年 12 月 26 日
1.4.0 2022 年 7 月 14 日
1.3.3 2022 年 3 月 11 日
1.2.0 2020 年 11 月 17 日

内存管理 中排名第 131

Download history 20/week @ 2024-04-07 27/week @ 2024-04-14 349/week @ 2024-04-21 309/week @ 2024-04-28 104/week @ 2024-05-05 222/week @ 2024-05-12 158/week @ 2024-05-19 319/week @ 2024-05-26 247/week @ 2024-06-02 147/week @ 2024-06-09 107/week @ 2024-06-16 179/week @ 2024-06-23 101/week @ 2024-06-30 414/week @ 2024-07-07 395/week @ 2024-07-14 456/week @ 2024-07-21

每月下载量 1,397
3 crates 中使用

MIT 许可证 MIT

49KB
1.5K SLoC

smallmap

使用单个字节键索引的小型表映射。专为具有微小键的映射设计。

页面存储为 256 个条目的键值数组,通过字节键索引进行索引。键用于碰撞检查,在碰撞时检查下一页或插入所需的项。 smallmap 对于所有不变量都可以表示为唯一字节类型的情况,永远不会需要分配超过 1 页。

用法

API 是与 HashMap 相似的一个子集,包含相同的 insertgetentry 函数

fn max_char(chars: &str) -> (char, usize)
{
    let mut map = Map::new();
    for x in chars.chars() {
		*map.entry(x).or_insert(0usize) += 1;	
    }

	map.into_iter().max_by_key(|&(_, v)| v).unwrap_or_default()
}

用例

适用于您想要具有相对简单键的小型映射的实例(例如,原始类型)。在这些情况下,性能可以比基于哈希的映射快一个数量级或更多。

可能使用的情况

  • 您有小型键
  • 您的映射不存在拒绝服务攻击的风险。
  • 当作为 u8 表示时,您的键不太可能有很多碰撞。

不使用的情况

  • 您有复杂键
  • 拒绝服务是一个担忧
  • 您的映射将包含大量条目
  • 当作为 u8 表示时,您的键可能有大量碰撞。

基准测试

一些粗略和基本的基准测试

char

哪个 ns/iter
HashMap 16
smallmap::Map 7

迭代字符串的字符并计数

哪个 ns/iter (entry) ns/iter (get/insert)
HashMap 8,418 8,367
BTreeMap 9,742 6,329
smallmap::Map 4,416 1,739

u8

哪个 ns/iter
HashMap 15
smallmap::Map 2

许可证

MIT 许可证

依赖关系

~185KB