一般有两种方式:开放寻址法和拉链法。最常用的当属拉链法了,基于数组+链表实现,先使用散列函数将键key映射到数组索引(如:计算hash值,并按数组长度取模),因为不同的键key可能映射到同一个数组索引,所以多个键值对形成链表。
源码中,mapaccess1核心计算逻辑:
b := (*bmap)(add(h.buckets, (hash&m)*uintptr(t.bucketsize)))
用来获得桶数组索引地址,hash&m进行二进制与操作(全为1才为1)相当于h % m, 得到一个小于等于m的值,然后乘以每个数组元素的内存大小计算出对应index的地址偏移量
tips:
m掩码全为1, 比如11,即可根据hash二进制取0-3,类似mod
tips:
range 是值复制