Skip to content

哈希进阶:开放定址、扩容策略与工程实现


1. 基础哈希表讲完后,为什么还不够

基础章已经回答了两个问题:

  1. 哈希表为什么平均查找快。
  2. 拉链法为什么能处理冲突。

但如果想真正理解工程级哈希表,还需要继续往下追:

  1. 为什么有些实现不用链表,而用开放定址?
  2. 删除为什么会比插入更微妙?
  3. 扩容为什么不能简单粗暴地“一次性全搬”?
  4. 一致性哈希为什么被分布式系统反复使用?

这些问题共同决定了哈希表从“课堂结构”走向“系统部件”的质量。

2. 开放定址:把元素直接放在桶数组里

开放定址法不再让每个桶挂链表,而是要求元素本身就落在桶数组中。冲突时,按照某种探测规则寻找下一个可用槽位。

开放定址的优点:

  1. 内存布局更紧凑。
  2. 缓存局部性通常更好。
  3. 不需要每个桶再持有链式节点对象。

缺点:

  1. 删除更麻烦。
  2. 高装载因子下性能下降更明显。
  3. 探测策略不好时容易形成聚集。

3. 三种常见探测方式

3.1 线性探测

3.2 二次探测

3.3 双重哈希

4. 删除为什么会破坏查找链

5. Go 实现一个线性探测哈希表

5.1 这段代码揭示了什么

6. 装载因子不是“参考数字”,而是性能阈值

7. 一次性扩容与渐进式扩容

8. Robin Hood 哈希的思想

9. Go 的 map 为什么不等于“哈希表已经学完”

10. 并发环境下为什么哈希表更难

11. 一致性哈希:从单机结构到分布式映射

11.1 普通取模的问题

11.2 一致性哈希环

12. 学完哈希进阶后应该抓住什么