¿Por qué no hay tablas hash en la biblioteca estándar de C?

10 minutos de lectura

¿Por que no hay tablas hash en la biblioteca estandar
Shankar Raju

¿Por qué no hay compatibilidad con Hashtable como parte de la biblioteca C estándar? ¿Hay alguna razón específica para esto?

  • es parte de una estrategia para aumentar el empleo entre los desarrolladores C.

    – Queso

    25 de mayo de 2011 a las 1:14

  • Cómo versionar: stackoverflow.com/questions/4384359/…

    – Ciro Santilli Путлер Капут 六四事

    20 de agosto de 2017 a las 18:36

C parece inusual para los estándares actuales porque no hay estructuras de datos útiles definidas. Ninguna. Ni siquiera cadenas, y si cree que una cadena C es una estructura de datos, bueno, tendremos que estar en desacuerdo sobre qué es una “estructura de datos”.

Si le gusta C, piense en él como una “pizarra en blanco”… toda su aplicación está hecha de código escrito por usted y las bibliotecas que elige extraer, además de algunas funciones de biblioteca estándar bastante primitivas, con quizás una o dos excepciones como qsort. La gente usa C en estos días para implementar cosas como Python, Ruby, Apache o el kernel de Linux. Estos son proyectos que usan todas sus propias estructuras de datos de todos modos, y no es probable que usen algo como STL.

Muchas bibliotecas C implementan tablas hash genéricas. Hay compensaciones, y puedes elegir tu favorito. Algunos de ellos son configurables mediante devoluciones de llamada.

  • Glib tiene un objeto de tabla hash (documentación)
  • Apache Portable Runtime tiene una tabla hash (documentación)
  • La biblioteca Core Foundation de Apple tiene una tabla hash (documentación) Nota: Sí, puede insertar cualquier objeto como clave o valor.
  • UTHash es una biblioteca de tablas hash (documentación)
  • Otra biblioteca de tablas hash (Enlace)

Con todas estas bibliotecas que hacen lo que quieres, ¿cuál es el punto de agregar una tabla hash al estándar C?

  • Hmm, no estoy seguro de estar de acuerdo con el bit “La cadena C no es una estructura de datos” (aunque no es suficiente para votar negativamente): tienen una estructura definida y funciones para manipularlos. Aparte de la complejidad, no estoy seguro de que sea diferente a un BTree o un HashTable. En cualquier caso, también tenemos FILE * 🙂

    – pax diablo

    25 de mayo de 2011 a las 2:43


  • +1 para una respuesta que realmente hace un trabajo decente al responder la parte “por qué”.

    – R.. GitHub DEJA DE AYUDAR A ICE

    25 de mayo de 2011 a las 3:34

  • @paxdiablo: Pensé en mencionar FILE*… ese es un buen punto.

    -Dietrich Epp

    25 de mayo de 2011 a las 5:04

  • Por la presente propongo la estructura de datos punchcard_t para que sea la solución final a los problemas de cadenas de C. La estructura de datos se definirá como typedef struct { char data[81];} punchcard_t; y se definirá en stdpunchcard.h. Será la solución para “devolver cadenas comunes sensibles a los humanos de las funciones”.

    – Dmitri

    1 de septiembre de 2016 a las 12:03


  • La mejor respuesta. No hay necesidad de crear una biblioteca de tablas hash estándar porque en este nivel, realmente le importa cuál usar, por lo que debe buscar algunas bibliotecas de código abierto o escribir la suya propia.

    – sudo

    26 de julio de 2017 a las 10:38

¿Por que no hay tablas hash en la biblioteca estandar
paxdiablo

No hay una tabla hash en la biblioteca C estándar porque:

  • nadie ha presentado una propuesta al grupo de trabajo; o
  • el grupo de trabajo lo ha considerado innecesario.

Así es como funciona ISO. Las propuestas se presentan y se aceptan o rechazan.

Debe tener cuidado con lo que agrega a la biblioteca estándar ya que tiene dos grupos en conflicto. Como un usuario, es posible que desee agregar todas las estructuras de datos bajo el sol al estándar para que el lenguaje sea más útil.

Pero, como lengua implementador (aparte, estas son probablemente las personas que tienden a formar la mayoría de los diversos grupos de trabajo, por lo que es probable que su punto de vista tenga más impacto), realmente no desea la molestia de tener que implementar cosas que pueden no ser utilizadas por todos. Todo lo que estaba allí cuando apareció C89 tenía que ver con el hecho de que el propósito principal era codificar la práctica existente en lugar de introducir nuevas prácticas. Todas las iteraciones de los estándares desde entonces han sido un poco más libres en lo que pueden hacer, pero la compatibilidad con versiones anteriores sigue siendo un tema importante.

Yo mismo, también tengo conflictos. Me encantaría tener todas las características de las bibliotecas de Java, C++ o Python a mi disposición en C. Por supuesto, eso haría mucho más difícil aprender todo para los recién llegados y, como dijo un comentarista, probablemente lo haría más difícil. code monkey puede generar código útil, reduciendo mi valor en el proceso 🙂

y yo bastante tener todas las estructuras de datos que necesitaré, de mi larga y (en su mayoría) ilustre carrera. No está limitado a la biblioteca estándar para este tipo de cosas. Hay muchas herramientas de terceros que puede obtener para hacer el trabajo y (como yo) también puede implementar las suyas propias.

Si desea saber por qué se tomaron ciertas decisiones en cada iteración, ISO (y ANSI originalmente, antes de que ISO se hiciera cargo) generalmente publica documentos de justificación. El C89 de ANSI se puede encontrar aquí. Contiene esta pequeña belleza en el alcance:

Este Justificación se centra principalmente en las adiciones, aclaraciones y cambios realizados en el lenguaje como se describe en los Documentos base. No es una justificación para el lenguaje C en su conjunto: el Comité se encargó de codificar un lenguaje existente, no de diseñar uno nuevo. En esta Justificación no se intenta defender la sintaxis preexistente del lenguaje, como la sintaxis de las declaraciones o la vinculación de los operadores.

Disfruto especialmente la admisión de que no son responsables de ningún lío profano que pueda haber precedido a sus intentos de estandarizar.

Pero, quizás la verdadera respuesta a su pregunta se encuentre en este fragmento, uno de los principios rectores:


Mantener el espíritu de C. El Comité mantuvo como objetivo principal preservar el espíritu tradicional de C. Hay muchas facetas del espíritu de C, pero la esencia es un sentimiento comunitario de los principios subyacentes en los que se basa el lenguaje C. Algunas de las facetas del espíritu de C se pueden resumir en frases como:

  • Confía en el programador.
  • No impida que el programador haga lo que debe hacerse.
  • Mantenga el lenguaje pequeño y simple.
  • Proporcione solo una forma de hacer una operación.
  • Hágalo rápido, incluso si no se garantiza que sea portátil.

Esa tercera es probablemente la razón principal por la que la biblioteca no se expandió masivamente con el esfuerzo de estandarización inicial; eso, y el hecho de que tal expansión de un comité probablemente habría resultado en que ANSI C se etiquetara como C2038 en lugar de C89.

  • “Mantenga el lenguaje pequeño y simple. Proporcione solo una forma de hacer una operación”. ¿En este todavía C estás hablando? int o o firmado o firmado int, if-else o ?:, if-else o switch, macros o funciones similares a funciones, continuar o romper o ir a o regresar;, const int o int const, typedef struct o struct, enum o const o #define, malloc o calloc, NULL o 0 o ‘\0’, *(ptr+n) o ptr[n]. Etc, etc, esto es solo la parte superior del iceberg en el que podría estar todo el día, de verdad.

    – Lundin

    25 de mayo de 2011 a las 6:22

  • Además, el comité realmente hizo un esfuerzo admirable para hacer que el lenguaje fuera innecesariamente complejo. ¿Cuándo fue la última vez que usó los siguientes encabezados: complex.h, errno.h, fenv.h, float.h, inttypes.h, iso646.h, locale.h, signal.h, wctype.h? Para mí, un archivo de encabezado que contiene una tabla hash parece cien veces más útil que estos.

    – Lundin

    25 de mayo de 2011 a las 6:29

  • @Lundin: vea la sección que contiene “encargado de codificar un existente lenguaje, no diseñar un nuevo uno”. La mayoría de esas cosas ya estaban allí antes de ANSI. De esos encabezados, a menudo he usado errno, locale y signal – No creo que haya siempre usé cualquiera de los otros pero, de nuevo, no soy el único codificador de C en el planeta 🙂 Cosas como complex, fenv, inttypes, iso646 y wctype vino más tarde, así que no tiene nada que ver con la lógica C89. Tendría que mirar las razones para las iteraciones específicas.

    – pax diablo

    25 de mayo de 2011 a las 6:45


  • @Lundin: por ejemplo: “Una nueva característica de C99, se agregaron tipos complejos a C como parte del esfuerzo por hacer que C sea adecuado y atractivo para la programación numérica general. La aritmética compleja se usa mucho en ciertas áreas de aplicación importantes”. – desde open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf

    – pax diablo

    25 de mayo de 2011 a las 6:49


  • Entonces, si el comité C90 se encargó de codificar un idioma existente, entonces uno puede preguntarse de qué se encargó el comité C99. “Cree tantas características nuevas sin sentido como sea posible, mientras evita cualquier mejora notable del lenguaje”, o algo por el estilo. Aparentemente todavía se reúnen varias veces al año, hablando de los buenos viejos tiempos.

    – Lundin

    25 de mayo de 2011 a las 6:57

1647542891 744 ¿Por que no hay tablas hash en la biblioteca estandar
coste y flete

La biblioteca C estándar no incluye ninguna estructuras de datos grandes y persistentes: ni listas, ni árboles, ni pilas, ni tablas hash.

Realmente no es posible dar una respuesta definitiva sin preguntar a los autores de la biblioteca C original. Sin embargo, una explicación plausible es que la implementación de dichas estructuras de datos implica varias compensaciones, y solo el autor de la aplicación está en la posición correcta para hacer esas compensaciones.

Tenga en cuenta que la biblioteca C estándar de POSIX especifica funciones genéricas de tabla hash: hcreate(), hsearch() y hdestroy(); y tenga en cuenta también que su “talla única” la naturaleza tiende a hacerlos inadecuados para la mayoría de los casos de uso del mundo real, lo que respalda el argumento anterior.

  • Hm, parece que las tablas hash POSIX solo te permiten crear una tabla hash a la vez. Eso suena muy útil.

    -Dietrich Epp

    25 de mayo de 2011 a las 1:30

  • Las funciones de la tabla hash POSIX son bastante inútiles en el código del mundo real.

    – R.. GitHub DEJA DE AYUDAR A ICE

    25 de mayo de 2011 a las 3:33

  • Ver hcreate_r que no tiene esta restricción (pero es una extensión no POSIX).

    – jjg

    10 de febrero de 2014 a las 10:52


1647542891 453 ¿Por que no hay tablas hash en la biblioteca estandar
Ciro Santilli Путлер Капут 六四事

Por falta de plantillas.

Esto es una suposición, pero no tener plantillas en el lenguaje como C++ hace que la implementación de contenedores sea muy poco elegante, ya que necesitaría docenas de definiciones para cubrir todos los tipos posibles, sin mencionar los tipos definidos por el usuario.

Hay estrategias C para mitigar esto, como jugar con void *pero pierden las comprobaciones de tipo de tiempo de compilación.

GLib y gnulib son mis implementaciones recomendadas en este momento: Quick Way to Implement Dictionary in C

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad