在C中查找数组(vs链表)哈希表实现

时间:2010-04-28 15:58:17

标签: c arrays hashtable hash-collision

我正在寻找C中的哈希表实现,它将对象存储在(二维)数组而不是链表中。 即如果发生碰撞,导致碰撞的对象将被存储在下一个自由行索引中,而不是被推送到链接列表的头部和第一个元素。

此外,必须将对象本身复制到散列表,而不是由指针引用。 (对象不会在程序的整个生命周期中存在,但表格确实存在)。

我知道这样的实现可能存在严重的效率缺陷,并且不是“标准散列方式”,但是当我在一个非常特殊的系统架构上工作时,我需要这些特性。

感谢

3 个答案:

答案 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