【问题标题】:C - Hashing a void type?C - 散列一个 void 类型?
【发布时间】:2016-12-27 09:47:21
【问题描述】:

我自己实现了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 进行完全不同的实现。谢谢。

【问题讨论】:

  • 欢迎来到 C。没有什么神奇的,你带上你自己的肌肉。
  • 您无法提取类型 void * 是“隐藏”(例如使用 (void *)&something)。
  • @KerrekSB 所以....我该怎么办?假设我想要多个HashMaps,每个key 都有不同的类型。一个key 将是double,另一个是string。当然,我不会复制粘贴整个HashMap.cHashMap.h 并制作HashMapForDoubles.cHashMapForDoubles.h
  • @Hatefiend:不,你没有,但你需要准备好在这方面投入大量的工作。基本上,您需要实现一个 ad-hoc vtable,并为每种类型创建所有相关的访问器函数(添加、查找、删除)。然后,对于您要使用的每种具体类型,您使用相应的访问器函数填充一个 vtable,并将该 vtable 传递给您的通用哈希表算法。
  • 一些事情。什么是ad-hoc vtable?另外,为什么每种类型都需要addfinddelete 方法?我的put 方法只是创建了一个Node,它具有void*keyvalue 所放置的任何内容。确定是 hash 方法需要考虑所有不同的类型,而不是任何其他方法?

标签: c hash hashmap hashtable


【解决方案1】:

看一下实现,例如qsort:他们让用户提供比较功能以便能够实现任意排序。

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

【讨论】:

  • 只是为了确定,this 是您所说的代码吗?
  • @Hatefiend 是的,这就是我所说的 - 也许没有太多的 code 可以重复用于您的目的,但绝对是 concept.
  • 您认为该源代码的哪一部分允许我向它提供数据来改变它的功能?
  • @Hashfiend qsort 不需要知道它实际上在排序什么。它接收一个名为cmp 的参数——这是一个指向用户提供的函数的指针,该函数需要返回>、cmp(比较,就像qsort 所做的那样)和一个元素的大小。
  • 非常感谢您的解释。我实际上查找了函数指针,这是解决这个问题的关键:)
猜你喜欢
  • 2016-10-08
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2018-09-13
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多