В первую очередь меня интересуют строковые ключи. Может кто-нибудь указать мне на библиотеку?
Поиск хорошей реализации хэш-таблицы в C
Ответ 1
У меня была такая же потребность, и я провел некоторое исследование и в итоге использовал libcfu
Это просто и понятно, поэтому, если мне нужно изменить, я могу это сделать, не тратя слишком много времени, чтобы понять. Это также лицензия BSD. Не нужно менять мои структуры (чтобы вставлять слова следующего указателя)
Мне пришлось отклонить другие варианты по следующим причинам (мои личные причины, YMMV):
- sglib → это макро-лабиринт, и мне было неудобно отлаживать/делать изменения на такой базе кода, используя только макросы
- cbfalconer → много лицензионных красных флагов, а сайт был опущен и слишком много неблагоприятных обсуждений в Интернете о поддержке/авторе; не хотел рисковать
- google sparce-hash → как уже сказано, это для С++, а не C
- glib (gnome hash) → выглядел очень многообещающим; но я не мог найти простой способ установить комплект разработчика; Я просто нуждался в C-подпрограммах/файлах - не в полной раздутой среде разработки
- Judy → кажется слишком сложным для простого использования.. также не был готов отлаживать себя, если мне приходилось сталкиваться с любыми проблемами.
- npsml (упомянутый здесь) → не может найти источник
- strmap найдено очень просто и полезно - просто слишком просто, что и ключ, и значение должны быть строками; Значение string является слишком строгим (должно принимать void *)
- uthash → кажется хорошим (упоминается в википедии на хэш-таблице); обнаружил, что он требует, чтобы структура была модифицирована - не хотела этого делать, поскольку performace на самом деле не является проблемой для моего использования - это большая скорость разработки.
В заключение для очень простого использования strmap является хорошим; uthash, если вы заинтересованы в использовании дополнительной памяти. Если только скорость разработки или простота использования является основной целью, libcfu выигрывает [note libcfu внутренне выделяет память для поддержки узлов/хэш-таблиц]. Удивительно, что существует не так много простых реализаций хэш-кода C.
Ответ 2
GLib - отличная библиотека для использования в качестве основы в ваших проектах на C. У них есть некоторые достойные предложения по структуре данных, включая таблицы Hash: http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html (ссылка обновлена 4/6/2011)
Ответ 3
Для строк, Judy Array может быть хорошо.
Массив Judy представляет собой сложную, но очень быструю ассоциативную структуру данных массива для хранения и поиска значений с использованием целых или строковых ключей. В отличие от обычных массивов, массивы Judy могут быть разреженными; то есть они могут иметь большие диапазоны неназначенных индексов.
Вот библиотека Judy в C.
Библиотека C, которая предоставляет самую современную базовую технологию, которая реализует разреженный динамический массив. Массивы Judy объявляются просто с нулевым указателем. Массив Judy потребляет память только тогда, когда он заселен, но может расти, чтобы при желании использовать всю доступную память.
Другие ссылки,
Эта ссылка ссылка на хеширование Википедии содержит несколько ссылок C
с открытым исходным кодом.
Кроме того, cmph - минимальная совершенная хеширующая библиотека в C
, поддерживает несколько алгоритмов.
Ответ 4
Здесь есть несколько хороших ответов:
Класс контейнера/библиотека для C
http://sglib.sourceforge.net.
http://cbfalconer.home.att.net/download/
Ответ 5
Dave Hanson C Интерфейсы и реализации включает в себя мелкую хеш-таблицу и несколько других хорошо спроектированных структур данных. Существует также красивый интерфейс обработки строк. Книга великолепна, если вы можете себе это позволить, но даже если это не так, я нашел это программное обеспечение очень хорошо разработанным, достаточно маленьким, чтобы учиться целиком и легко использовать его в нескольких разных проектах.
Ответ 6
Прошло много времени с тех пор, как я задал этот вопрос... Теперь я могу добавить свою собственную библиотеку общедоступного домена в список:
Ответ 7
C Интерфейсы и реализации обсуждает реализации хэш-таблицы в C. Исходный код доступен онлайн. (Моя копия книги работает, поэтому я не могу быть более конкретным.)
Ответ 8
Библиотека APR APR имеет свою собственную хэш-реализацию. Он уже перенесен на все Apache, и лицензия Apache также довольно либеральна.
Ответ 9
khash.h из samtools/bwa/seqtk/klib
curl https://raw.github.com/attractivechaos/klib/master/khash.h
Ответ 10
Никогда не использовал его, но Google Sparsehash может работать
Ответ 11
Загрузите tcl и используйте свою проверенную временем функцию хэша tcl. Это легко. API TCL хорошо документирован.
Ответ 12
Gperf - Perfect Hash Function Generator
http://www.ibm.com/developerworks/linux/library/l-gperf.html
Ответ 13
http://www.cl.cam.ac.uk/~cwc22/hashtable/
Определенные функции
* create_hashtable
* hashtable_insert
* hashtable_search
* hashtable_remove
* hashtable_count
* hashtable_destroy
Пример использования
struct hashtable *h;
struct some_key *k;
struct some_value *v;
static unsigned int hash_from_key_fn( void *k );
static int keys_equal_fn ( void *key1, void *key2 );
h = create_hashtable(16, hash_from_key_fn, keys_equal_fn);
insert_key = (struct some_key *) malloc(sizeof(struct some_key));
retrieve_key = (struct some_key *) malloc(sizeof(struct some_key));
v = (struct some_value *) malloc(sizeof(struct some_value));
(You should initialise insert_key, retrieve_key and v here)
if (! hashtable_insert(h,insert_key,v) )
{ exit(-1); }
if (NULL == (found = hashtable_search(h,retrieve_key) ))
{ printf("not found!"); }
if (NULL == (found = hashtable_remove(h,retrieve_key) ))
{ printf("Not found\n"); }
hashtable_destroy(h,1); /* second arg indicates "free(value)" */
Ответ 14
stl имеет карту и hash_map (hash_map только в некоторых реализациях), которые являются ключом к значению, если вы можете использовать С++.