我正在寻找C中的哈希表实现,它将对象存储在(二维)数组而不是链表中。 即如果发生碰撞,导致碰撞的对象将被存储在下一个自由行索引中,而不是被推送到链接列表的头部和第一个元素。
此外,必须将对象本身复制到散列表,而不是由指针引用。 (对象不会在程序的整个生命周期中存在,但表格确实存在)。
我知道这样的实现可能存在严重的效率缺陷,并且不是“标准散列方式”,但是当我在一个非常特殊的系统架构上工作时,我需要这些特性。
感谢
答案 0 :(得分:6)
一个超级简单的实现:
char hashtable[MAX_KEY][MAX_MEMORY];
int counts[MAX_KEY] = {0};
/* Inserting something into the table */
SomeStruct* some_struct;
int hashcode = compute_code(some_struct);
int size = sizeof(SomeStruct);
memcpy(hashtable[hashcode] + counts[hashcode] * size, some_struct, size);
++counts[hashcode];
不要忘记查看MAX_MEMORY
。
答案 1 :(得分:1)
我的猜测是你的系统不允许动态内存分配。因此,您需要定义对您的数据合理的前端数组边界(总对象数和最大预期冲突)以及对象的自定义散列函数,以便最好实现自己的散列表。
答案 2 :(得分:0)
它不是在C语言中,而是在C ++中,但是看看Google Sparse Hash - 可能会给你一些想法。关键要求是存储的对象有一种方式null
。