#hash-map #key-value #array #part #table #lua #ham

nightly no-std hash_arr_map

类似于 Lua 表的数组部分的哈希映射

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数据库接口

MIT 许可证

105KB
2.5K SLoC

hash_arr_map Crate

此 Crate 包含了哈希映射的不同实现,它不是总是存储键和值,对于特定的键,它只需存储值,并从值的上下文中推断键。

这导致映射具有独立的 arrayhash 部分,其中 hash 部分存储键和值,而 array 部分只存储值。数组部分的索引是从 1 开始的,这意味着键 0 不会被存储在其中。

该设计基于 Lua 的表设计,它是语言的关联哈希映射。由于它是 Lua 的唯一数据结构,它经常用于整数键。为了提高整数键表的性能,创建了一个单独的数组部分,该部分仅由整数索引,这意味着不需要对键进行哈希处理。

例如,假设你在数组部分和哈希部分中创建了一个容量为 2 的新的 [Ham]。

use hash_arr_map::Ham;
let mut map = Ham::with_capacity(2, 2);

然后,你向其中提供键值对 1, 102, 203, 304, 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 |
             +----+----+

注意,12 的键没有存储。这是因为它们可以从数组部分的索引中重新计算出来。

依赖关系