table用于key->value的应用,内部实现时对key分为整数或其他,分array和hash两个结构来保存。使用array的目的是为了优化对整数的处理。hash的实现方式是close hash,也就是闭散列,当一个key在准备插入hash时发现冲突,它会另外寻找一个free slot来保存此key-value, 而不是链接在冲突的slot后面。这样避免了在每次发生冲突时都会malloc内存,太麻烦

下面说下具体的冲突处理策略,具体的可以参加代码中注释,我就翻译一下

/*
** inserts a new key into a hash table; first, check whether key's main
** position is free. If not, check whether colliding node is in its main
** position or not: if it is not, move colliding node to an empty place and
** put new key in its main position; otherwise (colliding node is in its main
** position), new key goes to an empty position.
*/
TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {

当插入一个新的key-value时,首先计算hash(key),得到此key原本应该插入的slot位置,判断此slot是否空闲,如果已经被占用,判断占用这个slot的key-value是否原本应该在这个位置,

如果不是,则把这个鸠占鹊巢的key-value挪到其他地方,然后把新的key-value插入到此位置。否则,就把新的key-value插入到其他空闲的地方

 

另外一个注意的地方是插入的函数参数

TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) 

参数中只有key,而不是我们正常理解的把key-value都传进来。

  setobj2t(L, luaH_set(L, hvalue(t), &k), L->top - 1);

先把value的位置计算出来, 然后 *p_value = XXXX

 

其他的是细节的处理,例如resize等,这些不涉及整理把握table实现就不说了,自己也没看明白。先写这么多了



posted on 2012-03-31 17:10  brucexu  阅读(2144)  评论(0编辑  收藏  举报