#hash-map #map #lock #async #locking

chashmap-async

基于键域锁的并发异步哈希表

2个版本

0.1.1 2024年4月5日
0.1.0 2021年12月14日

#384 in 并发

Download history 111/week @ 2024-04-15 3/week @ 2024-05-13 182/week @ 2024-05-20 94/week @ 2024-05-27 234/week @ 2024-06-03 173/week @ 2024-06-10 72/week @ 2024-06-17 120/week @ 2024-06-24 116/week @ 2024-07-01 15/week @ 2024-07-08 19/week @ 2024-07-29

79 每月下载量
用于 reqwest-cache

MIT 许可证

72KB
1.5K SLoC

并发哈希表。

这是对 https://gitlab.redox-os.org/redox-os/chashmap 的分支,当时似乎很少维护。

此crate实现了基于桶级多读锁的并发哈希表。它具有优异的性能特性¹,并支持调整大小、原地修改等。

API直接源自 std::collections::HashMap,因此具有熟悉的感觉。

¹请注意,它严重依赖于您的程序行为,但在大多数情况下,它确实非常好。在某些(罕见)情况下,您可能需要原子哈希表。

工作原理

chashmap 不是无锁的,但它将锁分布在整个映射中,使得锁竞争(这可能会使访问变得昂贵)非常罕见。

哈希表由所谓的“桶”组成,每个桶定义了表中可能的一个条目。某个键值对的桶由键的哈希值确定。通过为每个桶持有读写锁,我们确保您通常只需一个或两个锁定子例程即可插入、读取、修改等。

有一个特殊情况:重新分配。当表填满到几乎没有空闲桶(注意,这“几乎没有”而不是“没有”,因为负载因子不应过高,因为它会损害性能)时,在重新哈希表时获取全局锁。这非常低效,但这种情况很少发生,并且由于容量是自适应的,因此它只在映射刚刚初始化时发生几次。

冲突解决

当两个哈希值冲突时,它们不能共享同一个桶,因此必须有一种算法可以解决冲突。在我们的情况下,我们使用线性探测,这意味着我们取紧随其后的桶,并重复,直到我们找到一个空闲的桶。

这种方法远非理想,但像Robin-Hood哈希这样的更优方法在并发结构中工作得不好(如果有的话)。

API

如果您习惯了libstd哈希表实现,API将感觉非常熟悉。它们共享许多方法,并且我已经仔细确保所有与libstd中类似命名的项在语义和行为上是一致的。

依赖关系

~1.5MB
~24K SLoC