Похоже, что вам нужна структура данных на основе карт , которая внутренне использует хеш-функцию. hash.h
предоставляет только последнее, но есть плавающие вокруг библиотеки, которые предоставляют вам структуру данных. Пример использования libHX (который доступен во всех основных дистрибутивах Linux) для отображения двойника на указатель (обработка ошибок опущена для краткости) с использованием определенной хеш-функции:
#include <stdio.h>
#include <libHX/map.h>
static unsigned long linux_hash(const void *p, size_t chars)
{
// replace return 0 by algorithm from hash.h
return 0;
}
static const struct HXmap_ops ops = {
.k_hash = linux_hash,
};
int main(void)
{
struct HXmap *map;
double i;
map = HXmap_init5(HXMAPT_DEFAULT, HXMAP_CKEY, &ops, sizeof(double), 0);
i = 3.141;
HXmap_add(map, &i, main);
i = 3.141/2;
HXmap_add(map, &i, map);
i = 3.141;
printf("3.141 maps to %p\n", HXmap_get(map, &i));
i = 3.141/2;
printf("pi/2 maps to %p\n", HXmap_get(map, &i));
return 0;
}
Когда k_hash не был указан, jenkins3 будет использоваться в качестве разумного значения по умолчанию. Хеш-функция из Linux hash.h
кажется очень минимальной и может не обеспечивать такие хорошие свойства.