Ensayo Seguridad WEB: Tablas Hash

Tablas Hash

Introducción:

Este ensayo hablara a cerca de lo que son las tablas hash como funcionan y más que nada saber cómo se usan y en que nos benefician o ayudan para un posible mecanismo de seguridad, todas estas preguntan se responderán a continuación, pero para empezar debemos definirlas como un diccionario, muchas aplicaciones requieren de un mecanismo que soporte las operaciones de un diccionario: Insert, Search, Delete. La tablas Hash son estructuras tipo vector que ayudan asociar claves con valores o datos, pero a ello vamos a definirlo mejor.

Desarrollo:
Como antes lo habíamos mencionado, una tabla hash es un contenedor asociativo que permite almacenar y recuperar eficientemente elementos, a partir de otros objetos que son las claves. Una tabla hash se puede ver como un conjunto de entradas. Cada una de estas entradas tiene asociada una clave única, y por lo tanto, diferentes entradas de una misma tabla tendrán diferentes claves. Esto implica, que una clave identifica claramente a una entrada en una tabla hash.

Las entradas de las tablas hash están compuestas por dos componentes, la clave y la información que se almacena en dicha entrada. Una tabla hash está formada por un array de entradas, que será la estructura que almacene la información, y por una función de dispersión. La función de dispersión permite asociar el elemento almacenado en una entrada con la clave de dicha entrada

Proveen un tiempo constante de búsqueda O(1), la idea surge de los arreglos que nos permiten acceso a sus elementos en orden O(1).  Una opción sería usar un arreglo tan grande como el rango de posibles claves. La desventaja es el espacio de memoria requerido en tal estrategia

Cabe destacar que cuando se usan tablas hash es frecuente que se produzcan colisiones. Las colisiones se producen cuando para dos elementos de información distintos, la función de dispersión les asigna la misma clave. Como se puede suponer, esta solución se debe arreglar de alguna forma. Para ello las tablas hash cuentan con una función de resolución de colisiones.


El aspecto más significativo de la búsqueda por hashing es que si eficiencia depende del denominado factor de almacenamiento Ó= n/M con n el número de items y M el tamaño de la tabla.

Por lo tanto hay dos tipos de tablas hash que se resuelven por este método de colisiones:

Encadenamiento separado(Hashing abierto)
Direccionamiento abierto (Hashing cerrado)
Al número medio de claves por lista se le llama factor de carga y habría que intentar que esté próximo a 1.
Utilizamos un vector y cuando ocurra una colisión, le reasignamos otro valor hash a la clave hasta que haya un hueco disponible.
Las fórmulas paroximadas son:

Cuando Ó>1
De esta forma la función de rehashing quedaria de la siguiente forma:
rehi(k) = (h(k)+(i-1)) mod M i=2,3,..

Generalmente, lo mejor es usar el encadenamiento separado para reducir los tiempos de búsqueda cuando el número de registros a procesar no se conoce de antemano.
Las operaciones que se presentan en esta aplicación son las siguientes:

Insertar: Para insertar un elemento hay que introducir, en el campo de texto del diálogo lanzado al pulsar el botón Insertar, el valor deseado. Este valor puede ser un número entero o una cadena de caracteres.
Borrar: Si se desea borrar un nodo se debe seleccionar dicho nodo y pulsar el botón Borrar.
Vaciar lista: Esta acción elimina todos los elementos presentes en la tabla.

Existen varios métodos de resolución pero solo hablaremos de 2 que considero más importantes, uno es el Hashing Abierto y  Hashing Cerrado, también destacaremos las  funciones Hash como por ejemplo el Método de Multiplicación y el Método de División:

Hashing Abierto:
Es cuando cualquier elemento es igualmente probable de caer en cualquiera de las m entradas de la tabla hash, independientemente de cualquier otro elemento, obviamente la cantidad de tiempo requerido para una búsqueda dependerá de la longitud de las listas y de las posiciones relativas de las claves en ellas. En hashing abierto la búsqueda no exitosa de una clave toma tiempo Ó(1+α),donde α es el factor de carga =número de claves en la tabla/número de entradas en la tabla hash Análogamente la búsqueda exitosa de una clave toma un tiempo Θ(1+α/2), la inserción de una clave toma Θ(1), la eliminación de una clave toma un tiempo Θ(1+α). Aquí suponemos que la clave debe ser buscada dentro de la lista, para luego ser eliminada.


Hashing Cerrado:
En este caso nos encontramos con el problema de que en el caso de que se produzca una colisión no se pueden tener ambos elementos formando parte de una lista para esa casilla. Para solucionar ese problema se usa lo que se llama rehashing. El rehashing consiste en que una vez producida una colisión al insertar un elemento se utiliza una función adicional para determinar cuál será la casilla que le corresponde dentro de la tabla, a esta función la llamaremos función de rehashing, rehi(k).
En Hashing cerrado todos los elementos o claves son almacenadas en la tabla hashing misma. Es decir cada entrada de la tabla contiene un elemento del conjunto dinámico o null. Cuando se busca, examinamos varias entradas hasta encontrarlo o es claro que no está.  No hay una lista ni elementos almacenados fuera de la “tabla”.  La tabla de podría llenar. El factor de carga no puede exceder 1.


Método de Multiplicación:
Esta técnica trabaja multiplicando la clave k por sí misma o por una constante, usando después alguna porción de los bits del producto como una localización de la tabla hash.
Primero, multiplicamos la clave por una constante A en el rango 0 < A < 1 y extraemos la parte fraccionaria de k*A.
Segundo, Multiplicamos este valor por el número de entradas de la tabla y tomamos el piso del (o truncamos el) resultado.

Método de División:
La función  se calcula simplemente usando h(k) = k mod M donde el 0  es el primer índice de la tabla hash de tamaño M
Una forma de hacer hash(k) dependiente de todos los bits menos significativos es usar número primos no muy cercanos a una potencia de dos

Conclusión:
Las tablas hash son una forma muy compleja de almacenar datos, el mecanismo que utiliza para que funcione al menos las dos principales que yo veo son, que tiene un almacenamiento asociativo  y que al tratar de recuperar la información lo hace de manera muy eficiente.  Por lo tanto, las tablas hash son muy útiles cuando el tiempo hay que acceder a la información de forma crítica. La gran eficiencia que proporcionan estas tablas permite que sean las estructuras de datos escogidas, en situaciones como la implementación de la tabla de símbolos dentro de un compilador.



Referencias:
The Human Communication and Interaction Research Group(18/11/2017)
Tablas Hash, obtenido de:

Universidad de Granada (18/11/2017)
Tablas Hash, obtenido de:

Benemérita Universidad Autónoma de Puebla (BUAP) (18/11/2017)
Tablas Hash y Árboles binarios, obtenido de:

Agustín J. González (2002)
Tablas Hash, ELO320: Estructura de Datos y Algoritmos, obtenido de:

EcuRed (18/11/2017)
Tabla Hash, obtenido de:

Comentarios

Entradas más populares de este blog

Ensayo SIstemas Distribuidos

Ensayo Cliente-Servidor

Ensayo Modelo OSI y TCP/IP