维基百科关于哈希表的文章 http://en.wikipedia.org/wiki/Hash_table对人们使用的不同哈希表方案提供了明显更好的解释和概述,这比我能想到的要好得多。事实上,您最好阅读那篇文章,而不是在这里提出问题。 :)
那是说...
链式哈希表索引到指向链表头的指针数组。每个链表单元格都有为其分配的键以及为该键插入的值。当您想要从其键查找特定元素时,键的散列用于计算出要遵循的链表,然后遍历该特定列表以查找您要查找的元素。如果哈希表中的多个键具有相同的哈希值,那么您将拥有包含多个元素的链表。
链式哈希的缺点是必须遵循指针才能搜索链表。好处是,链式哈希表只会随着负载因子(哈希表中元素与存储桶数组长度的比率)的增加而线性变慢,即使它上升到 1 以上。
开放寻址哈希表索引到指向(键,值)对的指针数组。您可以使用键的哈希值来确定首先查看数组中的哪个槽。如果哈希表中的多个键具有相同的哈希值,则您可以使用某种方案来决定要查找的另一个槽。例如,线性探测是指您查看所选插槽之后的下一个插槽,然后查看该插槽之后的下一个插槽,依此类推,直到您找到与您要查找的键匹配的插槽,或者您击中了一个空的插槽。槽(在这种情况下,钥匙不能在那里)。
当负载因子较低时,开放寻址通常比链式哈希更快,因为您不必遵循列表节点之间的指针。如果负载因子接近 1,它会变得非常非常慢,因为在找到您要查找的键或空槽之前,您通常必须搜索存储桶数组中的许多槽。此外,哈希表中的元素永远不能多于存储桶数组中的条目。
为了应对这样一个事实:当负载因子接近 1 时,所有哈希表至少会变得更慢(在某些情况下实际上完全崩溃),实际的哈希表实现使存储桶数组变得更大(通过分配新的存储桶数组,并从其中复制元素)当负载因子超过某一值(通常约为 0.7)时,将旧的装入新的,然后释放旧的。
上述所有内容都有很多变化。再次请看维基百科的文章,确实相当不错。
对于一个供其他人使用的图书馆,我会strongly建议尝试一下。由于它们通常对性能至关重要,因此您通常最好使用其他人已经经过仔细调整的哈希表实现。有许多开源 BSD、LGPL 和 GPL 许可的哈希表实现。
例如,如果您正在使用 GTK,那么您会发现有一个很好的GLib 中的哈希表 https://people.gnome.org/~ryanl/glib-docs/glib-Hash-Tables.html.