Instituto Tecnológico y de Estudios Superiores de Monterrey Práctica de Laboratorio 1 Optimización en el procesamiento de datos: Tabla Hash Marco teórico Existen muchas formas de almacenar datos en una computadora: a la forma de almacenar estos datos en memoria comúnmente se les llama estructura de datos. Sin embargo, el compromiso que existe entre la necesidad en velocidad de acceso a los datos, velocidad de almacenamiento, ahorro de recursos y escalabilidad de la estructura, comúnmente nos hace decidir por una estructura en específico; la realidad es que no se puede tener todo a la vez. En redes, en especial cuando se trata del procesamiento de paquetes, lo que se desea es que el sistema pueda procesar a la mayor velocidad posible. En muchas ocasiones, nuestras aplicaciones requieren acceder a los datos utilizando como clave para el acceso parte de esos mismos datos. Esta necesidad de acceso asociativo es una situación muy común en el mundo real. Además de esto, es bien sabido que el acceso a memoria es algo que limita la velocidad de cómputo de la mayoría de las computadoras. Ante esta situación, existe una estructura de datos que minimiza los accesos a memoria y de esta forma –si es bien diseñada- permite que la velocidad de acceso a los datos sea mínima, logrando el acometido que se tiene en redes con relación al procesamiento de paquetes. A esta estructura de datos se le conoce como tabla de dispersión de datos, o más comúnmente tabla hash, de la analogía con el significado estándar (en inglés) de dicha palabra en el mundo real: picar y mezclar. Una tabla hash consiste básicamente en aplicar una función a una llave (algún dato que permita indexar los registros de la tabla, puede ser una cadena de caracteres o un número real), el valor que te regresa la función es un apuntador a una tabla, la cual contiene los registros de datos. La idea es que cuando se quiera hacer una búsqueda del dato, simplemente se aplique la función de hash y se pueda obtener directamente el apuntador al registro asociado, sin necesidad de hacer una búsqueda exhaustiva como es el caso de muchas otras estructuras de datos. Debe de ser claro, de esta forma, que el tiempo de acceso va a depender solamente de la complejidad de la función hash, por lo que este tiempo va a ser un valor constante, independiente (por lo menos idealmente) del número de registros de la tabla. Sin embargo, las cosas no son tan sencillas, ya que en la práctica no se puede generar una función hash que genere un apuntador único para cada llave, por lo que cuando dos llaves diferentes generan un mismo apuntador, existe una colisión. Existen muchos métodos para tratar las colisiones; sin embargo el que se sugiere en el libro y el que se sugiere aquí es el de doble hash con direccionamiento abierto. Doble hash se refiere a aplicar una nueva función hash cuando ha sucedido una colisión para poder crear un apuntador diferente; direccionamiento abierto se refiere a hacer solamente uso del arreglo de memoria reservado, y no hacer uso de listas o alguna otra estructura de datos para extender el arreglo. Como desventaja de las funciones hash se tiene el hecho de que la necesidad de tener los datos dispersos en la tabla comúnmente tiene como consecuencia que se desperdicien recursos de memoria; por su puesto, esto es una desventaja mínima teniendo en cuenta las grandes ventajas que posee. Objetivo Aprender sobre un concepto que está enfocado a optimizar el procesamiento de datos y por consiguiente, el procesamiento de paquetes en redes. En específico, el objetivo es implementar una tabla de hash desde cero. Descripción Se pide un programa donde se implemente una tabla de hash en memoria dinámica. La tabla de hash debe de tener la capacidad de inserción y búsquedas de datos. Se sugiere el uso del algoritmo que se encuentra en el libro de texto (hash doble con direccionamiento abierto), pero cualquier otro algoritmo de hash que sirva para el mismo propósito estará bien. Se pide además que la tabla de hash tenga un propósito específico: sirva para procesar direcciones MAC; es decir, el programa deberá de tener la capacidad de insertar y buscar direcciones MAC en la tabla de hash. Nota: Esta tabla de hash se usará en prácticas posteriores con algunas modificaciones, por lo que es muy importante la realización de la práctica y el total entendimiento de la misma. Ing. Jorge A. Bustamante Horta Ing. Octaviano Flores González Ing. Roberto De León