回顾一下
上一篇说了说table的数据结构和长度,主要是数组部分。
这次就跟着源码看一下table的哈希表部分处理哈希碰撞的策略。
哈希表的创建
创建一个table时,会调用Table *luaH_new (lua_State *L, int narray, int nhash)
,同时分配了数组部分和哈希表部分的内存:
// ltable.c
Table *luaH_new (lua_State *L, int narray, int nhash) {
Table *t = luaM_new(L, Table);
luaC_link(L, obj2gco(t), LUA_TTABLE);
t->metatable = NULL;
t->flags = cast_byte(~0);
/* temporary values (kept only if some malloc fails) */
t->array = NULL;
t->sizearray = 0;
t->lsizenode = 0;
t->node = cast(Node *, dummynode);
setarrayvector(L, t, narray);
setnodevector(L, t, nhash);
return t;
}
static void setnodevector (lua_State *L, Table *t, int size) {
int lsize;
if (size == 0) {
/* no elements to hash part? */
t->node = cast(Node *, dummynode);