map底层使用散列表hash,平时一直都在听hash,到底什么是hash?
一个哈希表里面有多个哈希表节点bucket,一个bucket保存了map中的一个或者一组键值对。
map本质
type hmap struct {
count int // 当前保存的元素个数
B uint8 // 指示bucket数组的大小
buckets unsafe.Pointer // bucket数组指针,数组的大小为2^B
}
bucket也是一个结构体
type bmap struct {
tophash [8]uint8 //存储哈希值的高8位
data byte[1] //key value数据:key/key/key/.../value/value/value...
overflow *bmap //溢出bucket的地址
}
tophash 是长度为8的数组,哈希值低位相同的键存入当前bucket时会将hash值的高位存储在数组中(低位找到数据存在那个桶,高位找到桶在那个位置)
哈希冲突
当有两个或者两个以上数量的键被哈希到了同一个bucket的时候,我们称这些键发生了冲突
是B决定了buckets 指向的数组的大小,还是相反呢?
当两个或者两个以上数量的键被哈希到了同一个bucket的时候,这些键就发生了冲突,这个具体的哈希的过程是怎么进行的呢?
冲突了之后,是先存储在八个位置中的其他位置吗?还是直接就存储到了overflow指向的bucket中了?
哈希因子过大,也就是键的数量变多,bucket数量变少,bucket的数量不是只有冲突的时候才会增多吗?如果增多了,那负载因子应该是会减少的?