#hash-table #hash-map #order #key #iteration #index #index-map

no-std ordermap

具有一致顺序和快速迭代的哈希表

28 个版本

0.5.2 2024 年 8 月 13 日
0.5.0 2024 年 6 月 25 日
0.4.2 2018 年 11 月 17 日
0.4.1 2018 年 2 月 14 日
0.2.7 2016 年 11 月 2 日

#index-map 中排名 16

Download history 14846/week @ 2024-05-02 8786/week @ 2024-05-09 7769/week @ 2024-05-16 8977/week @ 2024-05-23 8943/week @ 2024-05-30 6271/week @ 2024-06-06 9092/week @ 2024-06-13 8089/week @ 2024-06-20 8101/week @ 2024-06-27 9773/week @ 2024-07-04 10707/week @ 2024-07-11 9984/week @ 2024-07-18 10715/week @ 2024-07-25 10715/week @ 2024-08-01 13668/week @ 2024-08-08 12059/week @ 2024-08-15

48,767 每月下载量
少于 12 crate 中使用

Apache-2.0 OR MIT

220KB
4K SLoC

ordermap

build status crates.io docs rustc

一个纯 Rust 哈希表,可以在有限的意义上保持插入顺序。

该 crate 实现了紧凑的映射和集合数据结构,其中键的迭代顺序与其哈希值或值无关。它在大多数修改操作中保持插入顺序,并允许通过哈希表键或数值索引查找条目。

注意:该 crate 原本是成为 indexmap 的东西,曾一度被废弃,但后来 ordermap 作为 indexmap 的包装器返回,具有更强的排序属性。

背景

这受到了 Python 3.6 的新字典实现(它记得插入顺序并且迭代速度快,在内存中紧凑)的启发。

其中一些功能被翻译到了 Rust 中,而另一些则没有。结果是 ordermapindexmap,具有以下属性的哈希表

  • 顺序与 哈希函数 和键的哈希值无关。
  • 迭代速度快。
  • 在紧凑的空间中索引。
  • 只要你不调用 .swap_remove() 或其他显式改变顺序的方法,它就 保持 插入顺序。
    • ordermap 中,常规的 .remove() 确实 保持插入顺序,相当于 indexmap 调用的 .shift_remove()
  • 使用 hashbrown 作为内部表,就像 Rust 的 libstd HashMap 一样。

自0.5版本重新引入以来,ordermap 也使用了其条目顺序来为 PartialEqEq 提供支持,而 indexmap 则将相同条目在 任何 顺序下视为相等,以便与 HashMap 的语义兼容。使用顺序可以更快,并且还允许 ordermap 实现 PartialOrdOrdHash

性能

OrderMap 直接从其构建方式中得出一些性能事实,大致如下

原始的键值索引哈希表和一个键值对向量。

  • 作为一个包装器,OrderMap 在大多数操作中应该与 IndexMap 保持相同的性能,主要区别在于删除策略。
  • 迭代非常快,因为它是在密集的键值上进行的。
  • 查找速度较快,因为初始的7位哈希查找使用了SIMD,并且索引是密集存储的。但查找也相对较慢,因为实际的键值对是分别存储的。(当CPU缓存大小限制时可见。)
  • 在实践中,OrderMap 已经在 PR45282 中的 rustc 中进行了测试,整个工作负载的性能大致相当。
  • 如果您想使用 OrderMap 的特性,或者其最强性能点适合您的负载,它可能是最佳的哈希表实现。

近期更改

请参阅 RELEASES.md

依赖项

~0.7-1.6MB
~28K SLoC