C - 对 void 类型进行哈希处理?

标签 c hash hashmap hashtable

我自己实现了 HashMap/HashTable (我知道它们是不同的,但这与这个问题无关)。

在这个实现中,我希望它非常灵活。我希望能够将整数、结构、字符、字符串等全部存储为键或值,而不必更改算法的代码。例如,在 Java 中我可以这样做:

HashMap<Integer, MyPersonalClass>它会起作用的。在 C 中,我知道除了 void* 之外没有直接等价的东西。 。问题是,如果我有:

/* Node structure. */
struct hm_Node
{
    void *key, *value;
    struct hm_Node *next;
};

作为组成我的 HashMap/HashTable 的节点,然后我的hash()方法需要以某种方式解析 key正确。到目前为止,我只查找了 char* 的算法.

有没有类似的东西:

// This may not be valid code, just using it as an example

unsigned int hash(void *ptr)
{
    switch(typeof(ptr)) // I know ptr is of type void*
    {
    case char*: ... break;
    case char: ... break;
    case int: ... break;
    }
}

这到底是如何运作的?我只是想避免对 X、Y 和 Z 类型的 HashMap 使用完全不同的实现。谢谢。

最佳答案

看看qsort的实现:它们让用户提供比较函数以便能够实现任意排序。

您可以采用同样的方式,让用户通过函数指针提供适当的哈希函数 - 如果需要,您可以为他们提供一些预构建的哈希函数,用于他们可以重复使用的标准类型。

关于C - 对 void 类型进行哈希处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39052477/

相关文章:

C管道多条消息只收到一条

algorithm - 自反哈希?

python - 如何在 python 中进行哈希访问?

C - 线程函数 : Casting a (void*) to a (long) and code works? 但是如何呢?

c - 高级内存编辑/函数调用

c - Fork - 相同的内存地址?

Ruby 将字符串转换为哈希

android - 第二个AlertDialog列表项点击基于第一个Alertdialog列表android

java - 正确调用 Hashmap 的 get() 和 put() 方法。

java - 准备多值国家 map