HASH碰撞

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

2.3、再哈希法

  • 使用另一个哈希函数重新计算索引

2.4、扩展哈希法

  • 数据库索引(如 B+ 树)使用 动态扩容 方式来减少冲突
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值