hash是我最近一段时间用的最多的一个数据结构,直接用的glib的GHashTable。虽然我有自己写的hashtable,但是那个太烂了,用了链表来解决hash冲突;为了不每写一个程序就link一次glib,我决定把glib的GHashTable抄过来。首先看明白其代码:
glib的hash跟别的hash不太一样的一点是,它创建的时候不需要指定hash槽的个数,它的值是动态扩展的。根据大小的不同,它从一个数组里面选择一个合适的mod值,采用线性开放定址法确定元素位置。下面这段代码是解决hash冲突的核心:
while (new_node->key_hash) { step++; hash_val += step; hash_val &= hash_table->mask; new_node = &new_nodes[hash_val]; }
其中hash_val &= hash_table->mask;确保了内存不会越界。一个问题是,怎么能够保证这个循环可以终止?从代码来看,GHashTable通过插入时resize,总是在hash表内保留了一些空的槽。但是这个算法怎么保证一定能遍历到其中的空槽?
待续……