C表示任何对象(类型void *)作为整数(计算的标识符)

时间:2016-08-30 21:32:40

标签: c hash hashmap hashtable

我需要实现存储任何类型键的哈希表(或哈希映射)。所以我使用了void *keysize_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 个答案:

答案 0 :(得分:1)

这里通常的答案是让C: \ xampp \ htdocs \ parent_folder \ name_project> gem install uglifier函数的调用者提供自己的哈希函数,如下所示:

insert

然后,您可以为要插入的每种类型实现哈希函数,并将其传递给void insert(struct hash_table* table, void* data, int (*hash_function)(void*)) { int hash = hash_function(data); // insert data... } 函数:

insert