2016-08-20 2 views
-1

Я сделал свою собственную реализацию 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. Благодарю.

+4

Добро пожаловать на C. Ничто не волшебство, вы приносите свои собственные мышцы. –

+0

Вы не можете извлечь тип 'void *' is 'hiding' (например, с помощью '(void *) & something'). – ForceBru

+0

@KerrekSB Итак ... что мне делать? Предположим, я хочу иметь несколько 'HashMaps', каждый из разных типов для' key'. Один 'ключ' будет' double', а другой - 'string'. Конечно, я не собираюсь копировать все мои 'HashMap.c' и' HashMap.h' и создавать 'HashMapForDoubles.c' и' HashMapForDoubles.h' – Hatefiend

ответ

2

Посмотрите на реализацию, например qsort: они позволяют пользователю предоставлять функцию сравнения, чтобы иметь возможность реализовать произвольные сортировки.

Вы можете пойти тем же путем, предоставив пользователю правильную хеш-функцию с помощью указателя функции. Если вы хотите, вы можете предоставить им некоторые встроенные хэш-функции для стандартных типов, которые они могут повторно использовать.

+0

Чтобы убедиться, это [это] (http://opensource.apple.com//source/xnu/xnu-1456.1.26/bsd/kern/qsort.c) код, о котором вы говорите? – Hatefiend

+0

@Hatefiend Да, это то, о чем я говорил - Может быть, не много * кода * для повторного использования для вашей цели, но, безусловно, это * концепция *. – tofro

+0

Какую часть этого исходного кода вы видите, что-то позволяющее мне предоставлять данные, которые меняют его функционирование? – Hatefiend