【发布时间】:2015-01-31 23:19:53
【问题描述】:
我在用 c 编程语言实现开放寻址哈希表时遇到了困难:
#ifndef COMDS_OPENADDR_HASH_TABLE
#define COMDS_OPENADDR_HASH_TABLE
#define COMDS_KEY_EXIST 1
#define COMDS_REALLOC_FAIL 2
struct kv_pairs {
void *key;
void *value;
};
typedef struct openaddr_hash_table {
size_t buckets;
size_t used;
size_t (*hash)(void *data);
struct kv_pairs *table;
int (*key_equal)(void *fkey, void *skey);
int (*value_equal)(void *fvalue, void *svalue);
}OpenAddrHashTable;
#endif
所以这里我使用了一个 struct kv_pairs 数组来保存我的键和值,问题是我必须有 3 个特殊值:DELETED、USED、FREE 表示该位置已删除/使用/免费,我不知道如何编码这些值?
我尝试设置 struct kv_pairs 并设置 FREE 0x0 DELETED 0x1 和 USED 0x2,并进行类似的比较
table[i] == FREE || table[i] == (struct kv*)DELETED
【问题讨论】:
-
你尝试过的有什么问题?你有什么问题(除了比较不相关的指针undefined behavior)?您是否尝试向任一结构添加标志?
-
您无法确定在任何给定平台上肯定是无效地址值的值。所以不要去定义这三个值。相反,分配 3 个全局或静态变量,并使用它们的地址。此外,您可能想与
table[i].value进行比较(尽管从问题中很难理解)。 -
在检查值之前,我会尝试检查 table[i] 是否空闲或已使用
标签: c hash hashtable collision-detection