go语言解决哈希冲突

354 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情 >> \

go 语言在解决哈希表中的哈希冲突时主要采用开放寻址法和拉链法

什么是哈希冲突及其解决:
对于同一个哈希函数,两个或多个不同的输入值,经过哈希计算后得到了相同的输出值。既多个不同的输入对应着同一个哈希值。这时就产生了哈希冲突。而 go 语言在解决哈希表中的键的哈希冲突时主要采用了两种方法开放寻址法和拉链法。
image.png 1.开放寻址法: 这种方法的核心思想是依次探测和比较数组中的元素以判断目标键值对是否存在于哈希表中,在使用这种方法时底层数据结构为数组。然而为了防止哈希值超出数组的大小一般会对得到的哈希值取余。

index = hash(key) % nums.length

开放地址法写入数据:
首先通过 key 经过哈希计算的得到相应的索引,若索引对应的位置上已经存入了数据,则向后遍历直到找到新的空位,将值存入空位中。

image.png
开放地址法读取数据:
首先通过 key 经过哈希计算的得到相应的索引,若索引对应的位置上已经存入了数据,则比较 key 是否与输入的 key 相同,若相同则取值,若不同则继续向后遍历直到找到相同的 key。
image.png
2.拉链法: 拉链法的底层数据结构一般为数组加链表: image.png
拉链法写入数据:
在写入数据时,键值对中的键会先经过一个哈希函数,哈希函数返回的哈希会选择一个桶,和开放地址法一样,选择桶的方式是直接对哈希返回的结果取模:

index = hash(key) % nums.length

选择了桶后就可以遍历当前桶中的链表了,在遍历链表的过程中会遇到以下两种情况:
1.找到键相同的键值对 — 更新键对应的值;
2.没有找到键相同的键值对 — 在链表的末尾追加新的键值对;
拉链法读取数据:
在读取数据时,也会先选择桶,找到相应的桶之后会依次遍历桶中的键值对,直到找到相应的键对应的值,将值返回。