面试题答案
一键面试Redis字典解决哈希冲突的方式
Redis字典采用链地址法(开链法)解决哈希冲突。在Redis的字典实现中,每个哈希表节点都有一个next指针,当不同的键值对经过哈希函数计算后得到相同的哈希值时,这些键值对会以链表的形式存储在同一个哈希表节点下。
常见的哈希冲突解决方法
- 开放定址法:当发生哈希冲突时,通过某种探测算法在哈希表中寻找下一个空的位置来存储冲突的数据。常见的探测方法有线性探测、二次探测和双重哈希等。
- 再哈希法:准备多个不同的哈希函数,当使用第一个哈希函数发生冲突时,就换用另一个哈希函数重新计算哈希值。
- 链地址法:将所有哈希值相同的元素构成一个链表,存储在哈希表的同一个位置。
- 建立公共溢出区:将哈希表分为基本表和溢出表,当发生冲突时,把冲突的数据存储在溢出表中。
Redis采用链地址法的优势
- 简单高效:实现相对简单,在插入和查找操作上性能较好。对于哈希冲突较多的场景,链表可以动态扩展,不会像开放定址法那样因为探测序列的问题导致性能急剧下降。
- 便于删除:在删除节点时,只需修改链表指针,而不会影响其他节点的位置,不像开放定址法删除节点后可能需要对后续节点进行调整。
- 内存使用灵活:链表节点的内存是动态分配的,只有在需要时才会为新节点分配内存,适合存储大量数据且数据量动态变化的场景。