Introducción. En el siguiente documento se muestra la investigación y proceso de desarrollo de una herramienta didáctica especificada en búsqueda haciendo uso del proceso de búsqueda por transformación de claves (O hashing en inglés). El objetivo de esta investigación tiene lugar en el ámbito de búsqueda en la estructura de datos, debido a que cuando trabajamos con algoritmos, normalmente nos interesa su rendimiento. Nos interesa saber, por ejemplo, de qué forma se comporta el algoritmo dado una cantidad determinada de datos a procesar. Como se menciona anteriormente, una de las ventajas de hacer uso del hashing es que mediante este proceso se pueden hacer mejoras a nuestros algoritmos de búsqueda aprovechando la información acerca de dónde se almacenan los ítems en la colección con respecto a los demás. Por ejemplo, al saber que se ordenó una lista, podríamos buscar en tiempo logarítmico usando una búsqueda binaria. Para hacer esto, necesitaremos saber aún más sobre dónde podrían estar los ítems cuando vamos a buscarlos en la colección. Si cada ítem está donde debe estar, entonces la búsqueda puede usar una sola comparación para descubrir la presencia de un ítem. Veremos, sin embargo, que éste no suele ser el caso. Cuenta también con la ventaja de que el tiempo de búsqueda es prácticamente independiente del número de componentes del arreglo. Por todo lo mencionado, para trabajar con este método de búsqueda debe elegirse previamente.
Una función hash que sea fácil de calcular y que distribuya uniformemente las claves. Un método para resolver colisiones. Si estas se presentan se debe contar con algún método que genere posiciones alternativas.
Antecedentes. El término hash proviene, aparentemente, de la analogía con el significado estándar (en inglés) de dicha palabra en el mundo real: picar y mezclar. Donald Knuth cree que H. P. Luhn, empleado de IBM, fue el primero en utilizar el concepto en un memorándum fechado en enero de 1953. Su utilización masiva no fue hasta después de 10 años. (Guardati, 1996) Metodología. Al conjunto U se le llama dominio de la función resumen. A un elemento de U se le llama preimagen o dependiendo del contexto clave o mensaje. Al conjunto M se le llama imagen de la función hash. A un elemento de M se le llama valor resumen, código hash o simplemente hash. Se dice que se produce una colisión cuando dos entradas distintas de la función resumen producen la misma salida. De la definición de función resumen podemos decir que U, el dominio de la función, puede tener infinitos elementos. Sin embargo M, el rango de la función, tiene un número finito de elementos debido a que el tamaño de sus cadenas es fijo. Por tanto la posibilidad de existencia de colisiones es intrínseca a la definición de función hash. Una buena función resumen es una que tiene pocas colisiones en el conjunto esperado de entrada. Es decir, se desea que la probabilidad de colisión sea muy baja. Para acortar, los hash o funciones de resumen son algoritmos que consiguen crear a partir de una entrada (ya sea un texto, una contraseña o un archivo, por ejemplo) una salida alfanumérica de longitud normalmente fija que representa un resumen de toda la información que se le ha dado (es decir, a partir de los datos de la entrada crea una cadena que solo puede volverse a crear con esos mismos datos). Estas funciones no tienen el mismo propósito que la criptografía simétrica y asimétrica, tiene varios cometidos, entre ellos está asegurar que no se ha modificado un archivo en una transmisión, hacer ilegible una contraseña o firmar digitalmente un documento. En definitiva las funciones hash se encargan de representar de forma compacta un archivo o conjunto de datos que normalmente es de mayor tamaño que el hash independientemente del propósito de su uso. Este sistema de criptografía usa algoritmos que aseguran que con la respuesta (o hash) nunca se podrá saber cuáles han sido los datos insertados, lo que indica que es una función unidireccional. Sabiendo que se puede generar cualquier
resumen a partir de cualquier dato nos podemos preguntar si se podrían repetir estos resúmenes (hash) y la respuesta es que teóricamente si, podría haber colisiones, ya que no es fácil tener una función hash perfecta (que consiga que no se repita la respuesta), pero esto no supone un problema, ya que si se consiguieran (con un buen algoritmo) dos hash iguales los contenidos serían totalmente distintos. Las funciones hash son muy usadas, una de las utilidades que tiene es proteger la confidencialidad de una contraseña, ya que podría estar en texto plano y ser accesible por cualquiera y aun así no poder ser capaces de deducirla. En este caso, para saber si una contraseña que está guardada, por ejemplo, en una base de datos es igual a la que hemos introducido no se descifra el hash (ya que debería de ser imposible hacerlo) sino que se aplicará la misma función de resumen a la contraseña que especificamos y se comparará el resultado con el que tenemos guardado (como se hace con las contraseñas de los sistemas Linux).
Objetivo general. Crear una aplicación didáctica, la cual muestre y explique el proceso de búsqueda en algoritmos haciendo uso de las llaves hash, dirigida a los alumnos en formación en los primeros semestres de la carrera de ingeniería en sistemas computacionales así como maestros que impartan la materia de estructura de datos y otras materias de programación, con el fin de dar a conocer este proceso y los beneficios que este conlleva. Objetivos específicos.
Conocer la historia, proceso y uso del proceso del hashing para su posterior implementación en un lenguaje de programación Mediante el uso de un lenguaje de programación, crear una herramienta que permita hacer uso del proceso de hashing, procurando que tanto alumno, como maestro tengan la misma facilidad en su uso. Aumentar las herramientas didácticas disponibles para alumnos en materias de programación. Documentar y establecer límites para el desarrollo de la herramienta didáctica y permitir con esto un correcto funcionamiento de la misma.
Bibliografía Aguilar, L. J. (2005). Fundamentos de programación, algoritmos, estructura de datos y objetos. Mexico. Guardati, O. C. (1996). Estructuras de Datos. México: McGraw-Hill. Speirs, W. (2007). Dynamic cryptographic hash functions. Purdue University School.