Я сделал свою собственную реализацию HashMap
/HashTable
(я знаю, что они разные, но это не имеет значения для этого вопроса).C - Хеширование типа пустоты?
В этой реализации я бы хотел, чтобы она была очень гибкой. Я хочу иметь возможность хранить ints, structs, chars, strings и т. Д. Все как ключи или значения без изменения кода моих алгоритмов. Например, на 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;
}
}
Как это работает именно? Я просто стараюсь избегать реализации совершенно другой реализации для HashMap типов X, Y и Z. Благодарю.
Добро пожаловать на C. Ничто не волшебство, вы приносите свои собственные мышцы. –
Вы не можете извлечь тип 'void *' is 'hiding' (например, с помощью '(void *) & something'). – ForceBru
@KerrekSB Итак ... что мне делать? Предположим, я хочу иметь несколько 'HashMaps', каждый из разных типов для' key'. Один 'ключ' будет' double', а другой - 'string'. Конечно, я не собираюсь копировать все мои 'HashMap.c' и' HashMap.h' и создавать 'HashMapForDoubles.c' и' HashMapForDoubles.h' – Hatefiend