关键数据结构
/* 主哈希表 */ static item** primary_hashtable = 0; /* 哈希表扩容的前期表,存储还没来得及移动到主哈希表的key */ static item** old_hashtable = 0; /* 哈希表中的item数 */ static int hash_items = 0; /* Flag: Are we in the middle of expanding now? */ static int expanding = 0; /* * 扩容迁移以bucket为单位,this is how * far we‘ve gotten so far. Ranges from 0 .. hashsize(hashpower - 1) - 1. */ static int expand_bucket = 0;
扩容
哈希扩容:哈希表扩容的到2hashpower+1个
状态标识:expanding 置为1,标识正在扩容
哈希搬家:old_hashtable = primary_hashtable;
查找
关注expanding判断在old_hashtable还是primary_hashtable
删除
_hashitem_before 获取删除之前的位置
插入
find一把,保证不冲突
算出哈希key
Expanding 则插入odl_hashtable,否则primary里边
! expanding && hash_items > (hashsize(hashpower) * 3) / 2 扩容
原文:http://www.cnblogs.com/stevinwang/p/4095098.html