C - Хеширование пустого типа?

c hash hashmap hashtable

249 просмотра

1 ответ

Я сделал свою собственную реализацию HashMap/ HashTable(я знаю, что они разные, но это не имеет значения для этого вопроса).

В этой реализации я бы хотел, чтобы он был очень гибким. Я хочу иметь возможность хранить целые числа, структуры, символы, строки и т. Д. В виде ключей или значений без необходимости изменять код моих алгоритмов. Например, в Java я могу просто сделать:

HashMap<Integer, MyPersonalClass>и это будет просто работать. Я знаю, что в Си нет прямого эквивалента 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. Благодарю.

Автор: Hatefiend Источник Размещён: 08.11.2019 11:06

Ответы (1)


2 плюса

Решение

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

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

Автор: tofro Размещён: 20.08.2016 09:25
Вопросы из категории :
32x32