哈希表Hash table

将键映射到桶,使用冲突处理策略定位记录。

核心约束
相等键必须产生相容的哈希值;冲突需进一步判等。
适用问题
按键精确定位,去重、多索引和缓存。
边界与取舍
不天然支持有序遍历;负载率、冲突与扩容影响延迟。
key Akey Bhashbucket 0bucket 1bucket 2
键先映射到桶,命中后仍需处理冲突并比较完整键。

常见操作#

n 为键数,C 为桶容量,α 为负载率,L 为键长;以下期望常数界假定哈希和相等比较为 O(1)O(1)。

操作时间复杂度条件与说明
按键查找期望 O(1)O(1);常见实现最坏 O(n)O(n)哈希分布良好且负载率受控;树化桶等实现有不同最坏界。
插入 / 删除期望摊还 O(1)O(1)扩缩容使用适当策略;单次重建或严重冲突可达 O(n)O(n)。
扩容并重新分桶O(n)O(n)表容量与元素数同阶,单个键的哈希成本视作常数。
遍历所有条目O(n+C)O(n+C)例如需要扫描桶数组的实现;过低负载率会增加扫描空桶的成本。
计算字符串键哈希O(L)O(L)未缓存哈希时要读取键内容,不能忽略在所谓 O(1)O(1) 查找之外。

时间与空间#

时间复杂度
查找 / 更新通常期望摊还 O(1)O(1)
存储空间
O(n+C)O(n+C)

普通哈希表不提供有序遍历或范围查询;对抗输入与随机种子会影响冲突风险。

工程中的应用#

6 个案例 · 附源码
QEMU·TCG 翻译块v9.2.0

QEMU TCG 用 QHT 保存 TranslationBlock 索引,帮助复用与当前客体执行状态一致的翻译结果。

附源码片段 · 缓存与复用
基础原理参考资料

Java 21 · HashMap负载率、容量、基本操作的分布前提和迭代成本。

Open Data Structures · ChainedHashTable链式哈希的期望分析和重建。

4 个概念