哈希表Hash table
将键映射到桶,使用冲突处理策略定位记录。
- 核心约束
- 相等键必须产生相容的哈希值;冲突需进一步判等。
- 适用问题
- 按键精确定位,去重、多索引和缓存。
- 边界与取舍
- 不天然支持有序遍历;负载率、冲突与扩容影响延迟。
常见操作#
n 为键数,C 为桶容量,α 为负载率,L 为键长;以下期望常数界假定哈希和相等比较为 。
| 操作 | 时间复杂度 | 条件与说明 |
|---|---|---|
| 按键查找 | 期望 ;常见实现最坏 | 哈希分布良好且负载率受控;树化桶等实现有不同最坏界。 |
| 插入 / 删除 | 期望摊还 | 扩缩容使用适当策略;单次重建或严重冲突可达 。 |
| 扩容并重新分桶 | 表容量与元素数同阶,单个键的哈希成本视作常数。 | |
| 遍历所有条目 | 例如需要扫描桶数组的实现;过低负载率会增加扫描空桶的成本。 | |
| 计算字符串键哈希 | 未缓存哈希时要读取键内容,不能忽略在所谓 查找之外。 |
时间与空间#
- 时间复杂度
- 查找 / 更新通常期望摊还
- 存储空间
普通哈希表不提供有序遍历或范围查询;对抗输入与随机种子会影响冲突风险。
工程中的应用#
6 个案例 · 附源码QEMU TCG 用 QHT 保存 TranslationBlock 索引,帮助复用与当前客体执行状态一致的翻译结果。
附源码片段 · 缓存与复用
libvirt 为 Domain 对象维护 UUID 与名称两个哈希索引,两个入口指向同一个对象。
附源码片段 · 索引与查找
把上下文身份编码进块哈希,让重复请求共享已经计算的 KV cache。
附源码片段 · 缓存与复用
Redis 有序集合既要按成员查分数,也要按分数和名次遍历;较大集合通过两种索引服务这些访问方式。
附源码片段 · 索引与查找
Redis 7.2.0 的字典扩缩容保留新旧两张哈希表,逐桶迁移,降低一次性搬迁全部条目的停顿。
附源码片段 · 索引与查找
Git 文本差异默认采用 Myers 路径;选择 patience 时先利用双方唯一的公共行建立锚点,再处理锚点之间的差异。
附源码片段 · 检索与计算