使用void指针的值作为哈希表中的键

时间:2017-09-04 03:37:00

标签: c pointers hash standards

我需要实现一个使用任意void指针作为键的字典。

为了进行访问O(1),我想散列指针本身的值(而不是它们指向的数据)。

例如,假设我有void *key,并且我已经有一个通用散列函数unsigned int hash(const char *data, size_t len)

unsigned int keyhash = hash((char *)&key, sizeof key);那样计算哈希值是否正确?

此外,为了处理冲突,我需要迭代哈希到相同值的所有键的链表。为此,标准是否允许将void *key1, *key2key1 == key2;memcmp(&key1, &key2, sizeof (void *));进行比较?

1 个答案:

答案 0 :(得分:-2)

据我所知,您想要对void指针的进行哈希处理。在这种情况下,此代码

  

unsigned int keyhash = hash((char *)& key,sizeof key);

传递void指针(即& 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指针很好。