C - 散列 void 类型?
C - Hashing a void type?
我自己实现了 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
:他们让用户提供比较功能,以便能够实现任意排序。
您可以通过让用户通过函数指针提供适当的散列函数来采用相同的方式 - 如果需要,您可以为他们提供一些预构建的散列函数,用于他们可以重复使用的标准类型。
我自己实现了 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
:他们让用户提供比较功能,以便能够实现任意排序。
您可以通过让用户通过函数指针提供适当的散列函数来采用相同的方式 - 如果需要,您可以为他们提供一些预构建的散列函数,用于他们可以重复使用的标准类型。