首页 文章

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

提问于
浏览
0

我需要实现 hash table (或哈希映射)来存储任何类型的键 . 所以我使用了 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 回答

  • 1

    这里通常的答案是让 insert 函数的调用者提供自己的哈希函数,如下所示:

    void insert(struct hash_table* table, void* data, int (*hash_function)(void*)) {
        int hash = hash_function(data);
        // insert data...
    }
    

    然后,您可以为要插入的每种类型实现哈希函数,并将其传递给 insert 函数:

    void hash_string(void* data) {
        char* s = (char*)s;
        // hash the string...
    }
    
    // somewhere else
    insert(&table, "Hello, world!", &hash_string);
    

相关问题