Мне нужно реализовать словарь, который использует произвольные указатели void в качестве ключей.
Чтобы сделать доступ O (1), я хотел бы хешировать значения самих указателей (а не данные, на которые они указывают).
Итак, например, предположим, что у меня есть void *key
, и у меня уже есть общая хэш-функция unsigned int hash(const char *data, size_t len)
.
Правильно ли делать что-то вроде unsigned int keyhash = hash((char *)&key, sizeof key);
для вычисления хеш-значения?
Кроме того, чтобы иметь дело с коллизиями, мне затем нужно было бы перебрать связанный список всех ключей, которые хешируются до одного и того же значения. Для этого позволит ли стандарт сравнивать void *key1, *key2
как key1 == key2;
или как memcmp(&key1, &key2, sizeof (void *));
?
sizeof key
неправильно. Потому что это не размер контента. - person BLUEPIXY   schedule 04.09.2017&key, sizeof key
верны. Возможно, но я в этом сомневаюсь. Если вы намеренно не хешируете значенияvoid
указателей (не то, что они указывают на, сами фактические адреса), делать то, что вы предлагаете, безусловно, неправильно. - person WhozCraig   schedule 04.09.2017hash((char *)&key, sizeof key)
выглядит именно так, как мне кажется. - person Steve Summit   schedule 04.09.2017==
для сравнения указателей, если они не обязательно указывают на один и тот же массив. - person Tob Ernack   schedule 04.09.2017==
. - person Ajay Brahmakshatriya   schedule 04.09.2017hash
. Мы действительно не знаем, что вы делаете сdata
. - person Ajay Brahmakshatriya   schedule 04.09.2017unsigned int keyhash = hash((char *)&key, sizeof key);
- неверна. Я не думаю, что вы должны делать&key
, так как вам не нужен адрес указателя void. Вам нужно значение, поэтому просто используйтеkey
, то есть без&
BTW: сравнение двух указателей void с использованием==
— это нормально. - person 4386427   schedule 04.09.2017void *
вuintptr_t
, поскольку сравнения между значениямиuintptr_t
(целое число без знака) полностью определены, даже если сравнения между значениямиvoid *
не определены. Теоретически у вас может быть система без типаuintptr_t
. Более прагматично, есть системы, в которых указатели на функции слишком велики, чтобы поместиться в любой указатель на объект (IBM AS/400 и последующие версии). - person Jonathan Leffler   schedule 04.09.2017