我需要实现一个使用任意void指针作为键的字典。
为了进行访问O(1),我想散列指针本身的值(而不是它们指向的数据)。
例如,假设我有void *key
,并且我已经有一个通用散列函数unsigned int hash(const char *data, size_t len)
。
像unsigned int keyhash = hash((char *)&key, sizeof key);
那样计算哈希值是否正确?
此外,为了处理冲突,我需要迭代哈希到相同值的所有键的链表。为此,标准是否允许将void *key1, *key2
与key1 == key2;
或memcmp(&key1, &key2, sizeof (void *));
进行比较?
答案 0 :(得分:-2)
据我所知,您想要对void指针的值进行哈希处理。在这种情况下,此代码
传递void指针(即& key)的地址而不是值(即只是键)时,unsigned int keyhash = hash((char *)& key,sizeof key);
错误。
看看这段代码:
#include <stdio.h>
#include <stdlib.h>
int hash(const char *data, size_t len)
{
// Dummy code ... just a print - no hash calculation
printf("value of data %p with size %zu\n", (void*)data, len);
return 0;
}
int main(void) {
void* key;
key = malloc(sizeof(int));
printf("value of key %p\n", key);
// First call using &key
unsigned int keyhash1 = hash((char *)&key, sizeof key);
// Second call using key (i.e. no &)
unsigned int keyhash2 = hash((char *)key, sizeof key);
free(key);
return 0;
}
输出可以是:
value of key 0x2b51dca5a010
value of data 0x7fffff6be5e8 with size 8
value of data 0x2b51dca5a010 with size 8
正如您所看到的,第一个函数调用没有获得指向malloced对象的指针的值,即第一次调用是错误的。第二个函数调用获取正确的值。
所以不要我们&key
- jus key
BTW:使用==
比较两个void指针很好。