我需要实现 hash table (或哈希映射)来存储任何类型的键 . 所以我使用了 void *key
和 size_t key_size
. 我需要为这些键写 *hash_function(void key, size_t key_size) .
散列函数需要计算数组中的索引 . 所以我首先需要计算这种对象的整数表示 . 如果这将是字符串,我可以获得字符串中每个字符的ascii数字并将它们相加 . 但我可以是任何类型(任何指针),即指向struct的字符串指针的指针,我该如何计算这样的整数表示?
也许我可以将 void *
转换为 char *
然后循环通过key_size字节?
static int hash_function(void *key, size_t key_size) {
unsigned int h = 0;
char *key_data = (char *) key;
for(int i=0; i < key_size; i++) {
h += key_data[i];
}
return (h * 1049) & HASHTAB_MASK; // HASHTAB_MASK = HASHTAB_SIZE - 1 used instead of modulo operation as such approach is faster
}
1 回答
这里通常的答案是让
insert
函数的调用者提供自己的哈希函数,如下所示:然后,您可以为要插入的每种类型实现哈希函数,并将其传递给
insert
函数: