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. 学完哈希进阶后应该抓住什么 ​