Hash 桶(Hash Bucket)是哈希表(Hash Table)中的一个概念,用于处理哈希冲突。当多个键(key)通过哈希函数映射到相同的哈希值(即索引)时,会发生哈希冲突,Hash 桶的作用就是存放这些具有相同哈希值的键值对。
Hash 桶的定义
哈希表的本质是一个通过哈希函数将键映射到数组索引的数据结构。数组中的每一个索引位置就可以称为一个 “桶”(Bucket)。当两个或多个键通过哈希函数计算出相同的哈希值时,这些键值对就会被放入同一个桶中。
解决哈希冲突的常见方法
-
链地址法(Separate Chaining):
- 当发生哈希冲突时,在桶中使用链表(或其它数据结构,如红黑树)来存储多个具有相同哈希值的键值对。
- 每个桶包含一个指针,指向一个链表的头节点。每次发生冲突时,将新键值对插入链表中。查找时,沿着链表逐一比对键。
优点:简单易实现,支持动态增长。
缺点:如果冲突频繁,链表过长,查找效率会下降到 O(n)。
-
开放地址法(Open Addressing):
- 当发生冲突时,不使用链表,而是通过再哈希的方式寻找下一个空桶。常见的开放地址法有:
- 线性探测(Linear Probing):如果当前桶位置已被占用,就尝试下一个位置,直到找到空闲的桶。
- 二次探测(Quadratic Probing):探测步长是平方关系,即第一步找下一个桶,第二步找第二个桶,依此类推。
- 双重哈希(Double Hashing):使用一个不同的哈希函数计算探测序列。
优点:节省内存空间,不需要额外的数据结构来处理冲突。
缺点:在高负载下(即哈希表较满时),冲突频繁,查找效率下降。
- 当发生冲突时,不使用链表,而是通过再哈希的方式寻找下一个空桶。常见的开放地址法有:
-
再哈希法(Rehashing):
- 当冲突率变高或者哈希表装载因子超过一定阈值时,哈希表会重新调整大小,并对所有键重新计算哈希值分配到新的桶中。
Hash 桶的作用
- 存储冲突元素:当多个键映射到同一个哈希值时,Hash 桶存储这些冲突的键值对。
- 提高查找效率:通过合理的设计和冲突处理机制,Hash 桶能有效减少冲突带来的性能问题,保证查找、插入、删除操作的时间复杂度接近 O(1)。
常见应用
-
Java 中的
HashMap
:- 在 Java 的
HashMap
中,每个桶的初始状态是null
,当哈希表中有键值对映射到某个索引位置时,使用链表来解决冲突。在 Java 8 及以上版本,当链表长度超过一定阈值(默认为 8)时,会将链表转换为红黑树,以提高查找效率。
- 在 Java 的
-
数据库中的哈希索引:
- 数据库的哈希索引使用哈希函数来加快数据查找。每个桶可以存储多个具有相同哈希值的记录。