课程章节:4-5 map:重写 Redis 能用它吗?(二)
课程讲师:Moody
课程内容:
创建map用的是 makemap方法
// 初始化一个hmap结构体
h = new(hmap)
.........
var nextOverflow *bmap
// 创建桶和溢出桶
h.buckets, nextOverflow = makeBucketArray(t, h.B, nil)
if nextOverflow != nil {
//溢出桶存放在 extra结构体中的nextOverflow
//nextOverflow是个指针,指向下一个可用的溢出桶
h.extra = new(mapextra)
h.extra.nextOverflow = nextOverflow
}
※计算桶号
把key和hash0取hash值,hash值会转换为2进制,如果当前桶的数量是8,那么B应该是3,如果B是3,那么就取二进制的哈希值的后三位,后三位表示的数字就是桶号
※tophash记录的是hash值的高8位
得到高八位后就去桶里找对应的key,如果hash碰撞很厉害,那么就穷举往下找,如果桶里的数据已经遍历完,就看有没有溢出桶,一直把所有的溢出桶也给遍历完,真的没有就说明没有这个key
课程收获:
学习了map的底层的一些知识,开始对go的map有一个直观的了解