#hash-map #cow #hash #swisstable

cow_hashmap

无需锁的写时复制的 HashMap

9 个版本

0.1.8 2024 年 7 月 27 日
0.1.7 2024 年 7 月 21 日

#871数据结构

Download history 342/week @ 2024-07-07 31/week @ 2024-07-14 375/week @ 2024-07-21 94/week @ 2024-07-28

842 每月下载量

MIT/Apache

98KB
2K SLoC

COW HashMap

Crates.io Documentation

该包采用了从 Google 的高性能 [SwissTable] 哈希表移植过来的原始 hashmap 实现,并用原子指针比较和替换操作封装它,从而赋予它写时复制的语义。

注意:将值插入到 hashmap 中将复制组成 hashmap 的碎片,因此在这里需要考虑性能因素。

这个 hashmap 在插入和读取方面表现良好,因此非常适合读取密集型操作。

HashMap 中叶子的值也采用写时复制,因此只读访问非常快,但写入将复制原始值并执行比较和交换操作。

许多使用 lambda 函数执行写操作的构造已经在比较和交换循环中实现,因此允许并发写操作而不会丢失数据,但是当使用 get_mut 获取值时,当它超出作用域时,值将被完全替换。

内部结构

HashMap 的工作原理如下

  • HashMap 使用三层不同大小的层构建,这些层经过优化以最大限度地减少复制的数量。
  • 向 hashmap 中插入或删除值时,会复制特定的碎片,然后执行比较和交换操作,以安全地将其替换到主映射中。
  • HashMap 中的每个条目在编辑时都会进行克隆。
  • 带有 lambda 的突变函数将比较和交换突变值,从而确保并发写操作是安全的。
  • 在层的最底层是一个普通的 hashbrown 表,其中包含实际的值。

性能

这不是最好的性能测试,但总比没有好!

向 HashMap 中插入和删除了 100 万条记录。

PS C:\Users\johna\prog\cow_hashmap> cargo test --release test_millions_of_inserts_and_removes
    Finished `release` profile [optimized] target(s) in 0.01s
     Running unittests src\lib.rs (target\release\deps\cow_hashmap-1df93076c4962117.exe)

running 1 test
test tests::test_millions_of_inserts_and_removes ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 32 filtered out; finished in 3.79s

PS C:\Users\johna\prog\cow_hashmap>

使用方法

将此添加到您的 Cargo.toml

[dependencies]
cow_hashbrown = "0.1"

然后

use cow_hashmap::CowHashMap;

let map = CowHashMap::new();
map.insert(1, "one");

许可证

许可方式为以下之一

任选其一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的任何贡献,都将按照上述方式双重许可,而无需任何附加条款或条件。

依赖关系

约 1.5MB
~19K SLoC