ventajas utilizacion tablas resolucion las desventajas conclusion componentes colisiones aplicaciones c string hashtable hash

resolucion - utilizacion de tablas hash



Buscando una buena implementación de tabla hash en C (14)

Aquí hay algunas buenas respuestas:

http://sglib.sourceforge.net .

Estoy principalmente interesado en las llaves de cadena. ¿Puede alguien señalarme hacia una biblioteca?


Descargue tcl y use su función de hash tcl comprobada en el tiempo. Es fácil. La API de TCL está bien documentada.






Las interfaces e implementaciones C de Dave Hanson incluyen una tabla de hash fina y varias otras estructuras de datos bien diseñadas. También hay una bonita interfaz de procesamiento de cadenas. El libro es excelente si puedes pagarlo, pero incluso si no, he encontrado que este software está muy bien diseñado, lo suficientemente pequeño como para aprenderlo en su totalidad, y fácil de reutilizar en varios proyectos diferentes.



Para cuerdas, Judy Array podría ser bueno.

Una matriz de Judy es una estructura de datos de matriz asociativa compleja pero muy rápida para almacenar y buscar valores usando enteros o claves de cadena. A diferencia de las matrices normales, las matrices Judy pueden ser dispersas; es decir, pueden tener grandes rangos de índices no asignados.

Aquí hay una biblioteca de Judy en C.

Biblioteca de CA que proporciona una tecnología básica de vanguardia que implementa una matriz dinámica dispersa. Las matrices Judy se declaran simplemente con un puntero nulo. Una matriz de Judy consume memoria solo cuando está poblada, pero puede crecer para aprovechar toda la memoria disponible si así lo desea.

Otras referencias,
Esta referencia de implementación hash de Wikipedia tiene algunos enlaces C código abierto.
Además, cmph - Una biblioteca mínima perfecta Hashing en C , admite varios algoritmos.


Tuve la misma necesidad e hice una investigación y terminé usando libcfu

Es simple y legible, así que si tengo que modificarlo, puedo hacerlo sin perder demasiado tiempo para entenderlo. También es de licencia BSD. No es necesario cambiar mis estructuras (para insertar, decir el siguiente puntero)

Tuve que rechazar las otras opciones por los siguientes motivos (mis razones personales, YMMV):

  • sglib -> es un laberinto macro y no me sentía cómodo depurando / haciendo cambios en una base de código con macros
  • ccfalconer -> gran cantidad de licencias de banderas rojas, y el sitio estaba caído y demasiadas discusiones desfavorables en la web sobre soporte / autor; no quería tomar el riesgo
  • google sparce-hash -> como ya se dijo, es para C ++, no para C
  • glib (gnome hash) -> parecía muy prometedor; pero no pude encontrar ninguna manera fácil de instalar el kit de desarrollo; Solo necesitaba las rutinas / archivos C, no el entorno de desarrollo completo
  • Judy -> parece demasiado complejo para un uso simple ... tampoco estaba listo para depurarme si tenía que encontrarme con algún problema
  • npsml (mencionado aquí) -> no puede encontrar la fuente
  • strmap encontró muy simple y útil; es demasiado simplista que tanto la clave como el valor deben ser cadenas; el valor de ser cadena parece demasiado restrictivo (debe aceptar el vacío *)
  • uthash -> parece bueno (ha sido mencionado en wikipedia en hashtable); encontré que requiere que struct se modifique - no quería hacer eso, ya que el rendimiento no es realmente una preocupación para mi uso, es más velocidad de desarrollo.

En resumen, para un uso muy simple, strmap es bueno; uthash si le preocupa el uso de memoria adicional. Si solo la velocidad de desarrollo o la facilidad de uso es el objetivo principal, libcfu gana [note libcfu internamente hace la asignación de memoria para mantener los nodos / hashtables]. Es sorprendente que no haya muchas implementaciones simples de hash C disponibles.




http://www.cl.cam.ac.uk/~cwc22/hashtable/

Funciones definidas

* create_hashtable * hashtable_insert * hashtable_search * hashtable_remove * hashtable_count * hashtable_destroy

Ejemplo de uso

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)" */