1、什么是HASH碰撞?
当不同的key计算出来相同的hash值则被定义为hash碰撞
2、如何避免HASH碰撞?
常见的解决方式有以下几种:
1、链地址法(拉链法)(JDK 8 及以上:链表 + 红黑树)
2、开放地址法(线性探测、二次探测、双重散列)
3、再哈希法
4、扩展哈希法(用于数据库索引)
2.1、链地址法
- jdk7及之前,采用链表的方式,将相同的hash值以链表的形式以此存储在同一个凹槽中
- jdk8 后采用链表+红黑树的存储结构
- 主要减少了深度,提高了查询效率
2.2、开放寻址
- 在计算的hash值位置向下寻找下一个空闲的位置存储数据
- 线性探测法(Linear Probing):index = (hash + step) % table.length
- 采用index + 1 的方式,寻找空闲位置
- 二次探测法(Quadratic Probing):index = (hash + step²) % table.length
- 采用index + 1 的方式,寻找空闲位置
- 双重哈希(Double Hashing):index = (hash1 + step * hash2) % table.length
- 线性探测法(Linear Probing):index = (hash + step) % table.length
2.3、再哈希法
- 使用另一个哈希函数重新计算索引
2.4、扩展哈希法
- 数据库索引(如 B+ 树)使用 动态扩容 方式来减少冲突