我正在寻找 C 中的哈希表实现,它将其对象存储在(二维)数组而不是链表中。即如果发生碰撞,导致碰撞的对象将存储在下一个空闲行索引中,而不是推到链表的头部和第一个元素。
另外,对象本身必须被复制到哈希表中,而不是被指针引用。(对象不会在程序的整个生命周期中存在,但表会存在)。
我知道这样的实现可能有严重的效率缺陷,并且不是“标准的散列方式”,但是当我在一个非常特殊的系统架构上工作时,我需要这些特性。
谢谢
我正在寻找 C 中的哈希表实现,它将其对象存储在(二维)数组而不是链表中。即如果发生碰撞,导致碰撞的对象将存储在下一个空闲行索引中,而不是推到链表的头部和第一个元素。
另外,对象本身必须被复制到哈希表中,而不是被指针引用。(对象不会在程序的整个生命周期中存在,但表会存在)。
我知道这样的实现可能有严重的效率缺陷,并且不是“标准的散列方式”,但是当我在一个非常特殊的系统架构上工作时,我需要这些特性。
谢谢
一个超级简单的实现:
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
。
我的猜测是您的系统不允许动态内存分配。因此,您需要为您的数据定义合理的前端数组边界(总对象数和最大预期冲突),另外还需要为您的对象定义一个自定义哈希函数,因此最好实现自己的哈希表。
它不是在 C 中,而是在 C++ 中,但看看Google Sparse Hash - 可能会给你一些想法。关键要求是被存储的对象有办法成为null
.