hashbrown

关注
义项:Rust哈希表库
hashbrown

hashbrown是Rust语言的一个哈希表实现库,以crate形式发布,把Google的高性能SwissTable哈希表算法移植到Rust,并提供与标准库HashMap、HashSet接口兼容的替代实现。自Rust 1.36起,标准库的HashMap即采用该实现[1]。它支持无标准库环境、具备较低的内存开销、默认哈希器比SipHash更快[2]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

hashbrown是一个用Rust编写的哈希表实现库,以crate(Rust的包)形式发布,其内容是把Google研发的高性能SwissTable哈希映射移植到Rust,并改写为可以顶替标准库HashMap和HashSet的替代实现。它的哈希映射模块采用二次探测配合SIMD查找的方式组织数据[3]。

该库同时提供HashMap、HashSet以及一套低层、显式哈希的HashTable结构,后者不做键的相等性封装,交由调用方处理[3]。哈希集合被实现为值恒为单位类型的哈希映射。

原理

hashbrown沿用了SwissTable的核心设计:为每个槽位额外保存一个字节的控制信息,该字节要么表示空槽、已删除的墓碑槽,要么保存键哈希的高7位(称为h2),槽位本身只保存键值对[4]。查找时先用哈希的其余位定位起始分组,再把控制字节数组一次性载入SIMD寄存器,与目标h2并行比较,仅当控制字节命中时才真正读取槽位并比较键,从而把大量不匹配的槽位一次性排除[4]。

在x86平台上,一次SIMD比较可覆盖16个控制字节;在部分ARM平台上则为8个[4]。控制字节数组的末尾会复制开头的一段,使分组载入在接近数组末端时仍然合法而无需额外分支判断[4]。探测采用步长逐步加大的三角形探测方式,以确保在容量为2的幂时每个分组都被恰好访问一次[4]。

需要说明的是,哈希映射被拆成只保存键值对的槽位数组与只保存控制信息的字节数组两部分,键值不会被搬进控制数组,因此二者可分别布局以改善缓存局部性[5]。

发展历程

hashbrown于2018年10月29日发布首个版本0.1.0,作者为Amanieu d'Antras,仓库最初位于其个人名下[6]。其后仓库迁入Rust官方组织之下,版权年份也由2018年至2019年延伸至2018年至2023年。

自Rust 1.36起,标准库的HashMap改用这一实现,但标准库使用自己的默认哈希器,而非该crate的默认哈希器[1]。因此标准库用户即便不直接依赖该crate,也在间接使用它的算法。

早期版本的默认哈希器为AHash,其速度明显快于SipHash,但抗哈希拒绝服务攻击的能力不如后者[7]。较晚的版本改以foldhash作为默认哈希器,同样在抗哈希DoS攻击的强度上不及标准库默认的SipHash[1]。随着功能更迭,该crate引入了Equivalent特质以便自定义相等性判断,并以raw-entry、default-hasher、allocator-api2等特性开关控制编译时的行为[1]。

不同版本对Rust编译器的最低要求随年代变化,早期版本的清单文件中标注的版本要求较低,后续版本逐步提高[8]。发行版方面,Fedora等Linux发行版以rust-hashbrown为包名进行打包,并随发行版周期反复重建[9]。

应用

hashbrown最直接的应用场景是替代标准库的哈希映射与哈希集合,二者接口基本兼容,切换到该crate通常只需修改依赖声明与引入路径。由于它可以在没有标准库的环境中工作,因而适用于嵌入式系统与内核一类的目标[1]。

在无标准库环境下使用该crate需要提供全局内存分配器,也就是引入alloc能力;作为附带特性,空的哈希表不会分配任何内存[1]。该库还提供可选的Rayon并行迭代器支持、Serde序列化支持,以及用于实验性低层访问的接口[10]。

作为被广泛依赖的基础组件,hashbrown被多个大型项目纳入第三方依赖,例如Chromium、Firefox的源码树中均可见其被并入的副本[10][11]。它的设计思路也被其他语言的哈希表实现借鉴,例如有提案参照SwissTable一族的做法为Ruby的哈希表引入每槽一字节的控制数组[5]。

局限

该设计对SIMD指令有一定依赖,在缺少相应硬件支持或需要在多种架构间保持一致的场景中,并行比较的优势会受到限制。同时,控制字节中的h2取自哈希高位,若所用哈希函数的高位分布不佳,探测时的误匹配率会上升,因此对哈希函数的高位质量有要求。

性能层面,采用AHash或foldhash作为默认哈希器时,虽然速度快于SipHash,但抗哈希拒绝服务攻击的能力弱于后者,如对该性质有要求就需另选哈希器[1]。此外,开放寻址与墓碑标记的组合意味着大量删除后需要就地进行重整而非扩容,其行为与链式哈希表不同[4]。

该crate的部分低层接口被标注为实验性且不安全,使用这些接口需要调用者自行保证边界与内存安全约束[10]。作为以库形式发布的组件,其可用性受所依赖的Rust编译器最低版本约束,使用较老工具链的项目可能无法采用新版[8]。

参见

  • Rust —— hashbrown是用Rust编写并以crate形式发布的库。

  • HashMap —— hashbrown提供与标准库同名同接口的哈希映射类型。

  • SIMD —— 该库利用SIMD指令并行比较控制字节以加速查找。

  • 哈希表 —— hashbrown属于开放寻址哈希表这一数据结构家族。

  • AHash —— 早期版本的默认哈希器。

  • CppCon —— SwissTable算法曾在该会议上被系统讲解。

参考资料

  1. crates.io: Rust Package Registry [引用日期2026-10-14]
  2. crates.io: Rust Package Registry [引用日期2026-10-14]
  3. Crate hashbrown Copy item path [引用日期2026-10-14]
  4. Reading hashbrown — SwissTable in Rust [引用日期2026-10-14]
  5. ruby-lang.org 上的网页 [引用日期2026-10-14]
  6. hashbrown 0.1.8 [引用日期2026-10-14]
  7. README [引用日期2026-10-14]
  8. hashbrown 0.14.2 [引用日期2026-10-14]
  9. rust-hashbrown0.12-0.12.3-6.fc43 [引用日期2026-10-14]
  10. README [引用日期2026-10-14]
  11. mozilla-central @ tip / third_party/rust/hashbrown/README.md [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T20:03:06Z

历史版本

本条目引用的词条
SIMD Rust HashMap 哈希表 AHash CppCon