#hash-table #hash-map #key-value #key-hash #hash-set #order #hash-values

no-std indexmap-amortized

具有一致顺序和快速迭代的哈希表。indexmap 是一个哈希表,其键值对的迭代顺序与键的哈希值无关。它具有通常的哈希表功能,除了在删除后,它保留了插入顺序,并且允许通过哈希表键或数值索引来查找其元素。还提供了一个相应的哈希集合类型。这个包是对 bluss/indexmap 的持续分支,它提供了摊销重新调整大小。

3 个稳定版本

1.6.1 2020 年 12 月 21 日
1.0.1 2020 年 7 月 27 日

#2154数据结构

Apache-2.0/MIT

190KB
4K SLoC

indexmap-amortized

build_status crates docs rustc

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

该包实现了紧凑的映射和集合数据结构,其中键的迭代顺序与其哈希或值无关。它保留了插入顺序(删除后除外),并允许通过哈希表键或数值索引查找条目。

该包是对 indexmap 的持续分支,它摊销了重新调整大小的成本。如果您不确定是否需要此功能,请查看 griddleatone 的文档,它们提供了底层摊销。

背景

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

其中一些功能被翻译到了 Rust 中,而另一些则没有。结果是 indexmap,它具有以下属性

  • 顺序是 与哈希函数和键的哈希值无关
  • 迭代速度快。
  • 在紧凑的空间中索引。
  • 只要您不调用.remove().
  • 它就像 Rust 的 libstd 中的 HashMap使用 hashbrown 作为内部表。

性能

IndexMap直接从其构建方式中得出几个性能事实,大致为

原始键值索引的哈希表和一个键值对的向量。
  • 迭代非常快,因为它在密集的键值上。
  • 删除速度快,因为它只在表中移动内存区域,并在向量中执行单个交换。
  • 查找速度较快,因为初始的7位哈希查找使用SIMD,并且索引存储密集。但由于实际键值对是分别存储的,所以查找速度较慢。(当CPU缓存大小限制时可见。)
  • 实际上,IndexMap在rustc的hashmap中进行了测试,见PR45282,在整个工作负载中性能大致相当。
  • 如果您需要IndexMap的属性,或者其最佳性能点适合您的负载,它可能是最好的哈希表实现。

近期更改

  • 1.6.1
    • 包不再仅限nightly版本!
    • 与上游版本1.6.1同步
  • 1.0.1
    • 请注意,包仅限nightly版本。
    • 使基准测试再次编译。
  • 1.0.0
    • 初始发布。

依赖关系

~1.2–1.6MB
~27K SLoC