map底层原理

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的数量不是只有冲突的时候才会增多吗?如果增多了,那负载因子应该是会减少的?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值