Dict(hash)

1.Dict由 哈希表 + 哈希节点 + 字典 组成
b8a21281924af162763c5a942d16201b954181d9

1.1 哈希冲突用拉链法
749ea965bea29960755c54722aa21b9c8bcf9899

1.2 Dict 内存 结构
3824c88b1613b3e298ee0a508aa1139c0fb38d93

2.1 rehash

2.1.1 扩容
由于size是固定的,当used达到一定大小必然出现hash冲突,
我们就规定一个负载因子used/size ,大于1的时候就说明用了拉链法
那么查找的话就要遍历链表,导致性能变差,因此需要对其进行扩容,
也即增加dictEntry[]的大小

70ce3fafee8f6a23ad96896e71822853ad08c822

2.1.2 收缩
fa6fe927896216dceae1d3dae0f4bd0617229f8c

2.1.3
过程图解

a.超出后复制rehash(因为sizemask变了,必须要rehash c)
56e5be5a481dbb44225ac84937c5403e6d910012

  1. 接管新的dictEntry*[]
    07bd907b28c2108ff6f36d58456822fb6952187b

2.1.4 rehash的时间—>渐进式的rehash
rehashidx用来判断当前rehash到了那个桶, 标记迁移的进度
9b8b7e0b5985cce914aca0a492bbc955ad7a8c9f

2.1.5 总结 ,注意扩容都是以2的幂为进制的
132fc8e32b6d7bc9f308830ee9872c5fe47b4bc1