5 个版本 (3 个破坏性更新)
0.4.0 | 2021 年 11 月 2 日 |
---|---|
0.3.1 | 2021 年 7 月 20 日 |
0.3.0 | 2021 年 7 月 19 日 |
0.2.0 | 2021 年 6 月 21 日 |
0.1.0 | 2021 年 6 月 15 日 |
#2713 在 数据库接口 中
105KB
2.5K SLoC
hash_arr_map Crate
此 Crate 包含了哈希映射的不同实现,它不是总是存储键和值,对于特定的键,它只需存储值,并从值的上下文中推断键。
这导致映射具有独立的 array
和 hash
部分,其中 hash
部分存储键和值,而 array
部分只存储值。数组部分的索引是从 1 开始的,这意味着键 0 不会被存储在其中。
该设计基于 Lua 的表设计,它是语言的关联哈希映射。由于它是 Lua 的唯一数据结构,它经常用于整数键。为了提高整数键表的性能,创建了一个单独的数组部分,该部分仅由整数索引,这意味着不需要对键进行哈希处理。
例如,假设你在数组部分和哈希部分中创建了一个容量为 2 的新的 [Ham
]。
use hash_arr_map::Ham;
let mut map = Ham::with_capacity(2, 2);
然后,你向其中提供键值对 1, 10
、2, 20
、3, 30
和 4, 40
。
map.insert(1, 10);
map.insert(2, 20);
map.insert(3, 30);
map.insert(4, 40);
由于有足够的空间,映射不会进行分配。
映射的可能布局如下
+----------------------------+
| Ham |
| +------------+-----------+ | +----+----+----+----+
| | array_part | hash_part ----> | 4 | 40 | 3 | 30 |
| +-----|------+-----------+ | +----+----+----+----+
+-------|--------------------+
| +----+----+
'--> | 10 | 20 |
+----+----+
注意,1
和 2
的键没有存储。这是因为它们可以从数组部分的索引中重新计算出来。