【发布时间】:2011-10-28 19:07:46
【问题描述】:
我想创建一个依赖于 C99 中独立向量数据结构的哈希表。我可以在 OO 的帮助下在 C++ 中做到这一点,但我不确定如何使用结构和联合来解决这个问题。
我希望任何链接示例不包含具有高度复杂散列函数的散列表实现。我并不特别关心碰撞或存储效率。我只想要关于如何进行的建议或一个简单的示例来举例说明相应数据结构的形式而不是功能。
【问题讨论】:
我想创建一个依赖于 C99 中独立向量数据结构的哈希表。我可以在 OO 的帮助下在 C++ 中做到这一点,但我不确定如何使用结构和联合来解决这个问题。
我希望任何链接示例不包含具有高度复杂散列函数的散列表实现。我并不特别关心碰撞或存储效率。我只想要关于如何进行的建议或一个简单的示例来举例说明相应数据结构的形式而不是功能。
【问题讨论】:
如果我正确推断您想以完全通用的方式实现增长的哈希表,那么您将需要大量 void 指针。矢量并不难,只是需要大量输入:
typedef struct {
size_t capacity, nelems;
void **contents;
} Vector;
enum { INITIAL_CAPACITY = 256 };
Vector *make_vector()
{
Vector *v = malloc(sizeof(Vector));
if (v == NULL)
return NULL;
v->capacity = INITIAL_CAPACITY;
v->contents = malloc(sizeof(void *) * v->capacity);
if (v->contents == NULL) {
free(v);
return NULL;
}
v->nelems = 0;
return v;
}
// exercise for the reader
int vector_append(Vector *, void *);
void *vector_at(Vector const *);
请记住,通用哈希函数将具有原型 size_t hash(void const *, size_t),即您需要传入大小。
(旁注:您不会错过的不是 C++ 的 OOP 功能;而是模板、他们购买的类型安全性以及诸如运算符重载之类的语法糖。查看 OpenBSD 的 ohash 库以获取更多示例.)
【讨论】:
以下书籍可能对链表和使用结构的 C 中的哈希表进行了最好的描述:
http://en.wikipedia.org/wiki/The_C_Programming_Language_(book)
它也实现了一个简单的哈希算法。
另一种简单但均匀分布的散列算法是此处定义的 cdb 算法:
【讨论】: