You are on page 1of 14

UNIVERSIDAD DON BOSCO

FACULTAD DE INGENIERIA
ESCUELA DE COMPUTACION
UNIDAD V. TECNICA HASHING

METODOS DE ORDENACIÓN
1. Introducción

Ordenar significa reagrupar o reorganizar un conjunto de datos u objetos en una secuencia


específica.

La operación de búsqueda para recuperar información normalmente se efectúa sobre elementos


ordenados, lo que demuestra que, en general, donde haya objetos que deban buscarse y recuperarse
estará presente el proceso de ordenación.
Formalmente se define ordenación de la siguiente manera:

Sea A una lista de N elementos: A 1, A2 , A3 , … ,A N

Ordenar significa permutar estos elementos de tal forma que los mismos queden de acuerdo con una
distribución preestablecida.

Ascendente: A 1 < A2 < A3 < … <AN


Descendente: A 1 > A2 > A3 > … > AN

En el procesamiento de datos, a los métodos de ordenación se les clasifica en dos categorías:

Ordenación de arreglos.
Ordenación de archivos.

La primera categoría recibe también el nombre de ordenación interna , ya que los elementos o
componentes del arreglo se encuentran en la memoria principal de la computadora.

La segunda categoría recibe también el nombre de ordenación externa , ya que los elementos se
encuentran en archivos almacenados en dispositivos de almacenamiento secundario como discos.

Ordenación Interna
Los métodos de ordenación interna se explicarán con arreglos unidimensionales, pero su uso puede
extenderse a bidimensionales (renglones y columnas) y tridimensionales (renglones, columnas y
páginas).
Los métodos de ordenación interna a su vez pueden ser clasificados en dos tipos:

Métodos Directos (n 2 ).
Métodos Logarítmicos (n*logn).

1
Los métodos directos tienen la característica de que sus programas son cortos y de fácil elaboración y
comprensión, aunque son ineficientes cuando N (el número de elementos del arreglo) es medio o
grande.

Los métodos logarítmicos son más complejos que los métodos directos. Cierto es que requieren de
menos comparaciones y movimientos para ordenar sus elementos, pero su elaboración y
comprensión resulta más sofisticada y abstracta.

Debe aclararse que una buena medida de eficiencia entre los distintos métodos la constituye el
tiempo de ejecución del algoritmo y éste depende fundamentalmente del número de comparaciones y
movimientos que se realicen entre elementos.

Como conclusión puede decirse que cuando N es pequeño deben utilizarse métodos directos y
cuando N es medio o grande deben emplearse métodos logarítmicos.

Los métodos directos más conocidos son:


Ordenación por intercambio.
Ordenación por inserción.
Ordenación por selección.

Ordenación Externa
En la actualidad es muy común procesar grandes volúmenes de información, motivo por el cual los
datos no pueden almacenarse en la memoria principal de la computadora. Estos datos, organizados en
archivos, se guardan en dispositivos de almacenamiento secundario (tales como discos).

El proceso de ordenar los datos almacenados en varios archivos se conoce con el nombre de fusión o
mezcla , entendiendo por este concepto la combinación o intercalación de dos o más secuencias
ordenadas en una única secuencia ordenada.

METODOS DE ORDENACION INTERNA

ORDENACION POR INTERCAMBIO DIRECTO


(BUBBLE SORT)

El método de intercambio directo posee dos variantes: almacenar los elementos más pequeños en la
parte izquierda del arreglo resultante (llenado del arreglo resultante de izquierda a derecha) o los más
grandes en la parte derecha del arreglo resultante (llenado del arreglo resultante de derecha a
izquierda).

Ejemplo 1.
Ordenar las siguientes claves del arreglo A, almacenando en cada pasada el menor elemento en la
parte izquierda del arreglo resultante:

A: 15 67 08 16 44 27 12 35

Las comparaciones que se realizan son las siguientes:

2
PRIMERA PASADA:

A[7] > A[8] ( 12 >35 ) No hay intercambio


A[6] > A[7] ( 27 >12 ) Si hay intercambio
A[5] > A[6] ( 44 >12 ) Si hay intercambio
A[4] > A[5] ( 16 >12 ) Si hay intercambio
A[3] > A[4] ( 08 >12 ) No hay intercambio
A[2] > A[3] ( 67 >08 ) Si hay intercambio
A[1] > A[2] ( 15 >08 ) Si hay intercambio

Luego de la primera pasada el arreglo queda de la siguiente forma:

Debe observarse que el elemento más pequeño, en este caso 08, fue situado en la parte izquierda del
arreglo.

SEGUNDA PASADA:

A[7] > A[8] ( 27 >35 ) No hay intercambio


A[6] > A[7] ( 44 >27 ) Si hay intercambio
A[5] > A[6] ( 16 >27 ) No hay intercambio
A[4] > A[5] ( 12 >16 ) No hay intercambio
A[3] > A[4] ( 67 >12 ) Si hay intercambio
A[2] > A[3] ( 15 >12 ) Si hay intercambio

Luego de la segunda pasada el arreglo queda de la siguiente forma:

El segundo elemento más pequeño del arreglo, en este caso 12, fue situado en la segunda posición.
Los elementos ya ordenados no se toman en cuenta para las posteriores pasadas (el arreglo se acota
en una posición para cada pasada).

En el cuadro siguiente, se presenta el resultado de las pasadas restantes:

3
Ejemplo 2.

Ordenar las siguientes claves del arreglo A, almacenando en cada pasada el mayor elemento en la
parte derecha del arreglo resultante:

A: 15 67 08 16 44 27 12 35

Las comparaciones que se realizan son las siguientes:

PRIMERA PASADA:
A[1] > A[2] ( 15 >67 ) No hay intercambio
A[2] > A[3] ( 67 >08 ) Si hay intercambio
A[3] > A[4] ( 67 >16 ) Si hay intercambio
A[4] > A[5] ( 67 >44 ) Si hay intercambio
A[5] > A[6] ( 67 >27 ) Si hay intercambio
A[6] > A[7] ( 67 >12 ) Si hay intercambio
A[7] > A[8] ( 67 >35 ) Si hay intercambio

Luego de la primera pasada el arreglo queda de la siguiente forma:

Debe observarse que el elemento más grande, en este caso 67, fue situado en la parte derecha del
arreglo (última posición).

SEGUNDA PASADA:
A[1] > A[2] ( 15 >08 ) Si hay intercambio
A[2] > A[3] ( 15 >16 ) No hay intercambio
A[3] > A[4] ( 16 >44 ) No hay intercambio
A[4] > A[5] ( 44 >27 ) Si hay intercambio
A[5] > A[6] ( 44 >12 ) Si hay intercambio
A[6] > A[7] ( 44 >35 ) Si hay intercambio

Luego de la segunda pasada el arreglo queda de la siguiente forma:

El segundo elemento más grande del arreglo, en este caso 44, fue situado en la penúltima posición.
Los elementos ya ordenados no se toman en cuenta para las posteriores pasadas (el arreglo se acota
en una posición para cada pasada).

En el cuadro siguiente, se presenta el resultado de las pasadas restantes:

4
De la misma manera existen otros métodos de ordenamiento de datos tales como: ordenación por
selección, ordenación por inserción, ordenación shell, ordenación rápida (quicksort), ordenación por
mezcla (mergesort), ordenación heapsort, ordenación beansort y ordenación radix sort entre otros

1. Colisiones y Cifrado de Hashing

Archivos de texto
Los archivos de texto son un caso particular de archivos de organización secuencial. Un archivo
de texto es una serie continua de caracteres que se pueden leer uno tras otro.

Un archivo de texto es un archivo en el que cada registro es del tipo cadena de caracteres.
El tratamiento de archivos de texto es elemental y en caso de lenguajes de programación es
posible detectar lectura de caracteres especiales como fin de línea o fin de archivo.

Cómo aumentar la velocidad de acceso a los archivos


La desventaja que presentan los archivos secuenciales frente a los archivos aleatorios es que las
diminutas operaciones se ralentizan. Cada operación requiere la lectura del archivo completo,
además algunos registros pueden ser modificados y por lo tanto necesitar ser escritos.
Existen organizaciones de archivos que permiten acceder a un registro, leyendo en la memoria
interna una pequeña fracción del archivo completo. En estas organizaciones cada uno de los
registros ha de tener una clave que identifica de manera unívoca al registro. Por ejemplo, el
campo numero de matricula del archivo de alumnos puede considerarse una clave. Puede
suponerse que no existen simultáneamente dos registros en el archivo con el mismo numero de
matricula.
Para lograr una mayor rapidez en las operaciones con los archivos secuenciales ciertos lenguajes
de programación permiten acceder a bloque, en vez de recorrer en secuencia los bloques de los
que consta el archivo. Para ello se utilizan apuntadores a los propios bloques que son direcciones
físicas de los mismos.

Archivos con función de direccionamiento hash


La técnica del direccionamiento hash o dispersión es muy utilizada para tener un acceso rápido a
información almacenada en archivos.

5
El objetivo que persigue esta técnica de direccionamiento se muestra en el ejemplo siguiente:
Supongamos un colegio de primaria con 240 alumnos. Cada alumno tiene un numero de
identificación de 6 dígitos, que será usado como campo clave en el archivo de alumnos del
colegio. Se podría pensar que en una organización tal que usase el número de identificación
como dirección del registro en memoria. Con esta organización, la búsqueda no requerirá
ninguna comparación, directamente accede al registro. Por desgracia, esta organización
requerirá un espacio de 1.000.000 posiciones de memoria, mientras que el espacio realmente
necesario son de 240 posiciones. Esto es un gasto de memoria desproporcionado, a costa de
tiempo, que no merece la pena.
Para el desarrollo de esta técnica se supone que se dispone de un archivo F de n registros. Cada
registro tiene un campo clave k que determinará los registros de F. También se supone que
existe una tabla en memoria de m posiciones y que l es el conjunto de direcciones de las
posiciones de la tabla. Las claves k pueden ser enteros, cadenas de caracteres…; por facilidad en
la notación se supone que tanto las claves k como las direcciones l son enteros.
La idea básica es utilizar la clave para determinar la dirección del registro, pero para no
desperdiciar tanto espacio, hay que realizar una transformación mediante una función hash del
conjunto kde claves sobre el conjunto l de direcciones de memoria.

h(x): k l

Esta es la función de direccionamiento hasho función de dispersión.


Hay que contemplar el hecho de que la función h(x)no de valores distintos: es posible (según la
función elegida) que dos claves diferentes k1 yk2 den la misma dirección. Entonces se produce
el fenómeno de la colisión, y se debe usar algún método para resolverla. Por lo tanto en el
estudio del direccionamiento de hash hay que dividirlo en dos partes:

Búsqueda de funciones hash


Resolución de colisiones

Propiedades:

Todos los HASHes generados con una función de hash tienen el mismo tamaño, sea cual
sea el mensaje utilizado como entrada.
Dado un mensaje, es fácil y rápido mediante un ordenador calcular su HASH.
Es imposible reconstruir el mensaje original a partir de su HASH.
Es imposible generar un mensaje con un HASH determinado.

Es decir, un algoritmo de HASH no es un algoritmo de encriptación, aunque sí se utiliza en


esquemas de cifrado, como algoritmos de cifrado asimétrico (por ejemplo: RSA 1. Ahora bien,
tener una función de estas características puede tener muchas aplicaciones.
Algunas de ellas pueden ser las siguientes:

1 RSA: El algoritmo fue descrito en 1977 por Ron Rivest, Adi Shamir y Len Adleman en el MIT; las letras RSA son las iniciales de sus
apellidos. Fue inventado en Schenectady (estado de Nueva York). Clifford Cocks, un matemático británico trabajando para la agencia de
inteligencia británica GCHQ describió un sistema equivalente en un documento interno en 1973. Debido a la lentitud de la implementación en las
computadoras de la época, se lo consideró una curiosidad. Su descubrimiento sin embargo no fue revelado hasta 1997 ya que era confidencial.

6
Comprobación de integridad de ficheros: Supongamos que queremos transmitir un
fichero a un amigo. Si antes de realizar este envío calculamos la función HASH del
fichero, para nuestro amigo del otro extremo es posible verificar la integridad del fichero
aplicando el mismo algoritmo al archivo que recibe. Si ambos coinciden, podemos
asegurar que el envío ha sido satisfactorio. Esta es una aplicación real que se utiliza, por
ejemplo, para comprobar la integridad de muchos paquetes que se descargan en
distribuciones del SO GNU/Linux.

Seguridad en procesos de identificación en sistemas: Los procesos de identificación


(Login+Password) se ven reforzados por estos algoritmos. Se utilizan de la siguiente
forma: cuando un usuario accede a su computadora debe introducir su nombre de usuario
y su password. Pues bien, si el sistema operativo no registra estos datos como “texto
claro” si no que registra el resultado de aplicarles una función HASH, en el caso de que
un usuario malicioso logre acceder a nuestro archivo de registros, no conseguirá (a menos
que el algoritmo utilizado sea malo o disponga de una supercomputadora) revertir el
contenido de dicho registro, y por tanto no puede acceder a nuestro sistema. Esta misma
idea se aplica en identificación de usuarios en muchas webs, con la diferencia de que para
que este esquema sea seguro debe incluir información adicional y “aleatoria”, como
marcas de tiempo y redundancias.

Firma digital: Estos algoritmos se utilizan en esquemas de firma digital para verificar la
integridad de la información enviada por el canal de comunicaciones. Algoritmos de
cifrado asimétrico, como RSA por ejemplo, realizan lo siguiente: Calculan la función
HASH del contenido del mensaje que se va a enviar y luego se firma dicho checksum con
la clave privada del emisor. Así se asegura la integridad de la información y el “no
repudio”.

Algunos de los algoritmos de HASH más utilizados son los siguientes:

MD5 (Message-Digest Algorithm 5 o Algoritmo de Firma de Mensajes 5) : Desarrollado


por Ron Rivest, y ha sido hasta los últimos año el algoritmo hash más usado. Procesa
mensajes de una longitud arbitraria en bloques de 512 bits generando un compendio de
128 bits. Debido a la capacidad de procesamiento actual esos 128 bits son insuficientes,
además de que una serie de ataques criptoanalíticos han puesto de manifiesto algunas
vulnerabilidades del algoritmo. Puede ser útil para comprobar la integridad de un fichero
tras una descarga, por ejemplo, pero ya no es aceptable desde el punto de vista
criptoanalítico.

SHA-1 (Secure Hash Algorithm 1 o Algoritmo de Hash Seguro 1) : El SHA-1 tomo como
entrada un mensaje de longitud máxima 264 bits (más de dos mil millones de Gigabytes)
y produce como salida un resumen de 160 bits. Este número es mayor que el que se
utilizaba en el algoritmo SHA original, 128 bits. Ya existen nuevas versiones de SHA
que trabajan con resúmenes de 224,256,384 e incluso 512 bits. En realidad, lo seguros o
inseguros que estos algoritmos sean no depende de los conocimientos informáticos o

7
telemáticos que uno tenga, si no en los conocimientos matemáticos. La intención es
demostrar por dónde cojean los algoritmos de HASH, la dificultad computacional que
presentan, y que soluciones se dan los posibles ataques que puedan sufr ir por parte de
individuos malintencionados.

ATACANDO LOS ALGORITMOS DE HASH: MD5 Y SHA-1


Desde el año 2004, aproximadamente, cuando saltaron las primeras noticias escandalosas sobre
la ruptura de MD5, la seguridad que ofrecen los algoritmos de HASH a nuestros esquemas de
cifrado ha sido una cuestión que se ha puesto en entredicho. ¿Qué seguridad ofrecen estos
algoritmos? ¿Resulta computacionalmente complejo romper uno de estos algoritmos? ¿Qué
solución se debe adoptar? Intentaremos resolver estas cuestiones. Intentemos dar una descripción
algo más matemática de lo que es una función HASH. Supongamos que tenemos un mensaje a,
al que aplicamos una función resumen a la que llamaremos h. Decimos entonces que el resultado
de esta operación, al que llamaremos b es el HASH de a. Es decir:

Esta función debe ser sencilla de realizar para un computador, pero computacionalmente
imposible realizar la operación inversa, al menos para usuarios normales .

Además, esta función tiene otra car acterística, el tamaño de la entrada no es de longitud fija,
puede ser de longitud variable. Esto tiene la siguiente consecuencia, que no demostraremos
matemáticamente, pero que asumiremos por estar razonado en otros artículos publicados en
Internet (al final se indican). Esta es la siguiente: es posible que dos mensajes de entrada a
produzcan el mismo mensaje de salida b. Es decir, es posible encontrar un mensaje c , tal que:
h(c)=b

Sin embargo, encontr ar ese mensaje debe ser, al igual que la particularidad antes mencionada,
muy complejo desde el punto de vista computacional. Para los algoritmos de HASH esto es lo
que se conoce como colisión : que dos mensajes de entrada produzcan el mismo mensaje de
salida.

Así, a priori, pudiéramos establecer dos posibles vulnerabilidades de las funciones HASH:

1. Que sea posible realizar la operación:


h -1 (b)=a

Habitualmente, a la operación de invertir la función HASH comprobando todas las posiblidades


para los bits de salida se le llama “ataque de fuerza bruta”. Esto es lo que debe ser
computacionalmente impracticable. Supondría aplicar la función HASH 2 n veces hasta encontr ar
la coincidencia ( n es el número de bits de salida de la función).

2. Que se hallen colisiones:


h(a)=b y h(c)=b, a! =c

8
Lo que antes hemos denominado colisión.

Estas dos posibles debilidades dan lugar a cuatro tipos de ataques:

Ataque Tipo 1.
El atacante es capaz de encontrar dos mensajes al azar que colisionan pero es incapaz de
hacerlo de forma sistemática. Si es capaz de dar sólo con dos mensajes que provocan
colisión, esta no es razón suficiente para tildar el algoritmo de ineficiente. Índice de
peligrosidad: *

Ataque Tipo 2
El atacante es capaz de generar dos mensajes distintos de forma que sus HASH
colisionen, pero sin saber a priori qué hash resultará. Es decir, el atacante no podría
generar “queriendo” el HASH que necesite para fines maliciosos. Índice de peligrosidad:
**

Ataque Tipo 3
El atacante es capaz de construir un mensaje sin sentido de forma que su HASH colisione
con el de un mensaje con sentido. Si este es el caso, el agente malicioso puede atacar
algoritmos de encriptación asimétricos con firma digital, haciendo que se firmen
mensajes sin sentido, y que el destinatario los acepte como fidedignos. Índice de
peligrosidad: ***

Ataque Tipo 4
El atacante es capaz de crear un segundo mensaje falso que tiene sentido y cuyo hash
colisiona con el del mensaje verdadero. En este caso, el atacante puede actuar con total
impunidad, pude falsificar certificados, firmar mensajes...el resultado sería desastroso.
Índice de peligrosidad: ****.

Funciones hash

Existe un numero considerable de funciones hash. Dos criterios que nos deben guiar al
seleccionar una función. En primer lugar, la función h(x) debe calcularse fácilmente, dependerá
de la clavel k.En segundo lugar, la función h(x) debe de distribuir uniformemente las
direcciones sobre el conjunto lde forma que se minimice el numero de colisiones. Nunca
existirá una garantía plena de que no haya colisiones y más sin conocer de antemano las claves y
las direcciones. La experiencia nos enseña de que siempre habrá que estar preparado parara
cuando se produzca alguna colisión.

Algunas de las funciones hash de cálculo más fácil y rápido se detallan a continuación:

Aritmética modular
Se elige m un número primo, o con pocos divisores, mayor que el número n de registros. La
función hash se define:

9
h(k) = k modm para que las direcciones vaya de 0 a m-1
o bien
h(k) = (k modm) +1 , así las direcciones irán de 1 a m

En esta formula m ha de ser primo, para minimizar el numero de colisiones.

Ejemplo:
En el archivo de alumnos se supone que el número de direcciones es de 996. La elección de m
en este caso será 997, que es el número primo más próximo.
Se aplica esta función hash a los alumnos cuyo número es:
245643 245981 257135

Y se obtienen estas direcciones:


h(245643) = 245643 mod 997 = 381
h(245981) = 245981 mod 997 = 179
h(257135) = 257135 mod 997 = 906

Plegamiento
La técnica del plegamiento consiste en partir la clave ken varias partes k1, k2, k3… kn y la
combinación de las partes de la clave de modo conveniente (con frecuencia sumando las partes)
da como resultado la dirección del registro.
Cada parte ki, con a lo sumo la excepción de la ultima tiene el mismo numero de dígitos que la
dirección especificada.

La función hash se define:


h(k) = k1 + k2 +…kn

En esta operación se desprecian los dígitos más significativos que se obtengan de acarreo

Ejemplo:
En el archivo de alumnos con el campo clave de de 6 dígitos. Un entero de 6 dígitos se puede
dividir en grupos de tres y tres dígitos
Aplicando esta función hash a los alumnos cuyo número:

245643 245981 257135

Se obtienen estas direcciones:


h(245643) = 245 + 643 = 888
h(245981) = 245 + 981 = 1226 = 226 (se ignora el acarreo 1)
h(257135) = 257 + 135 = 390

A veces se hace la inver sa de la partes pares, k2, k4, … antes de sumarlas, con el fin de afinar
mas. Así obtendríamos estas direcciones:

h(245643) = 245 + 346 = 591


h(245981) = 245 + 189 = 434

10
h(257135) = 257 + 531 = 788

Mitad del cuadrado

Este método consiste en calcular el cuadrado de la clave k y la dirección del registro viene
representada por los dígitos de k2 que ocupan cierta posición.
La función la define:
h(k) = c

Siendo C el numero formado por los dígitos de k2 que se encuentran en las posiciones P 1, P2, …
Pi, es importante utilizar siempre las mismas posiciones de k2 para todas las claves.

Ejemplo:

En el archivo de alumnos con el campo de clave de 6 dígitos.


Aplicamos esta función hash a los alumnos cuyo número:

245643 245981 257135

Se obtienen estas direcciones:

245643 60340483449 Escogiendo los dígitos cuarto, quinto y sexto por la derecha
h(245643) = 483

245981 60506652361
h(245981) = 652

257135 66118408225
h(257135) = 408

Resolución de colisiones

La función hash h(k) no siempre proporciona direcciones distintas; puede ocurrir que s para dos
claves diferentes k1, k2, h(k1) = h(k2), se obtenga la misma dirección.
Este hecho es conocido como colisión. Es evidente que se deben proporcionar métodos de resolución
de colisiones

Considérese el ejemplo de un taller de 18 empleados, con el campo clave del número de empleado
NE y 100 posibles direcciones. Con la función hash del modulo y tomando como m el primo 101,
las claves:
12345678 12345880

Proporcionan las direcciones:


H(12345678) = 12345678 mod 101 = 44
H(12345880) = 12345880 mod 101 = 44

11
Se tienen dos claves a las que aplicada la función hash se transforman en la misma dirección, se dice
que las claves han colisionado.
A continuación se muestran dos formas de resolver las colisiones, direccionamiento abierto y
encadenamiento; el procedimiento que se elija dependerá fundamentalmente de la relación entre el
numero n de registros (también numero de claves) y el numero de direcciones posibles m. Esta
relación se expresa = n/m, llamado factor de carga.
La eficiencia de una función hash junto con un método de resolución de colisiones se mide por el
número medido de comparaciones de claves necesarias para encontrar la dirección que ocupa un
registro con clave k. la eficiencia depende fundamentalmente del factor de carga .
S( ) = numero medio de comparaciones para una búsqueda con éxito
U( ) = numero medio de comparaciones para una búsqueda sin éxito

a) Direccionamiento abierto
Es la forma primaria de resolver una colisión entre claves. Supóngase que se va a añadir un registro
R de clave k, pero la posición que nos da la función h(k) = p está ocupada por otro registro. La
forma de resolver esta colisión es buscar la primera posición disponible que siga a p y asignar a esa
posición R. Hay que asumir que si tenemos a m es la posición 1, a la manera de arreglo circular.

Ejemplo:

Supongamos que se tienen los registros de claves, K1, K2, K3, K4, K5, K6, K7, K8 y K9. Para cada
uno de la función hash:

Registro K1 K2 K3 K4 K5 K6 K7 K8 K9
h(k) 5 8 11 9 5 7 8 6 14

Entonces los registros en el archivo aparecerán grabados en las siguientes posiciones:

Registro K1 K2 K3 K4 K5 K6 K7 K8 K9
Posición 5 8 11 9 6 7 10 12 14

El registro K8 es el único que tiene la dirección hash 6, sin embargo esa posición ya está ocupada por
K5 debido a una colisión previa, la siguiente posición libre es la 12.
El numero medio de comparaciones para una búsqueda con éxito S:

S = 1 + 1 + 1 + 2 + 1 + 3 + 7 + 1 = 2.00
9

b) Direccionamiento por encadenamiento

Este método para resolver colisiones de claves con la misma dirección hash se basa en la formación
de una lista enlazada con todos los registros que tienen la misma dirección.
Sea R un registro con la clave k, h(k) es el numero de lista enlazada que contiene el registro si R ya
está en el archivo. Los registros tendrán un campo Sgte adicional que se usara para mantener el
encadenamiento de los registros con la misma dirección hash .

12
En la figura se puede ver la estructura de datos básica para este método. La idea es fundamental que
si se ha elegido una función hash con un rango de m valores, 0 a m-1, se tiene una tabla de m
elemento indexada de 0 a m-1 que contenderá los apuntadores de m listas enlazadas.

Tabla T

Para añadir un registro con clave k, este se almacena en la primera posición libre del conjunto
posiciones de memoria reservadas para el archivo. A continuación insertamos el registro en la lista
de índice h(k) . Puede ocurrir que la lista está vacía, por no haber habido colisión, o bien que al
producirse una colisión haya que insertar en la lista. La inserción en la lista puede hacerse como
primer elemento, ultimo o una inserción ordenada.
El campo Sgte de cada registro hay que actualizarlo según el tipo de inserción.

Ejemplo:
Supongamos que se tienen los registros del ejemplo anterior:

Registro K1 K2 K3 K4 K5 K6 K7 K8 K9
h(k) 5 8 11 9 5 7 8 6 14

Tabla T
Disposición en archivo
Registro 1 : K1
Registro 2 : K2
Registro 3 : K3
Registro 9 : K9

DSP = 10

El rango de h(x) es 0…14, la tabla T de listas enlazadas estará indexada de o a 14.


Se puede observar que con este método la posición que ocupa un registro R no está directamente
relacionado con h(x). Un registro R se sitúa en la primera posición libre del fichero (la variable DSP
tiene la primera posición libre)

La búsqueda de un registro R no es más que la búsqueda de un nodo en una lista enlazada. Con la
función hash h(x) obtenemos el índice de lista que corresponde, después se busca en la lista. Lo
mismo ocurre con la eliminación de un registro, primero se busca en la lista enlazada que le
corresponde y a continuación se elimina de la lista.

13
Resumen:
• HASH = picar y mezclar (en inglés)
• La función HASH es una función de conversión o localización o dispersión para transformar
la clave en un índice (posición dentro de la estructura)
• Reduce un dominio amplio generando un conjunto menor de valores
• A veces, una función genera el mismo valor para dos claves diferentes (colisión) y se aplican
otros algoritmos para resolver esa situación
• Se espera que cumpla con:
– Distribuir las claves uniformemente, generando pocas colisiones
– Manejo simple de colisiones, tal que no aumente significativamente el tiempo medio
de administración
– Asegurar tiempo óptimo para evitar retraso por cálculo
• Usos
– Tablas de Hash= tablas de índices que agilizan el proceso de búsqueda de
información (bases de datos sobre todo)
Algoritmos de encriptación

Ejemplo de un registro:

Una tabla Hash se espera que cumpla con:


– Distribuir las claves uniformemente, generando pocas colisiones
– Manejo simple de colisiones, tal que no aumente significativamente el tiempo medio
de administración
– Asegurar tiempo óptimo para evitar retraso por cálculo

• Usos
– Tablas de Hash= tablas de índices que agilizan el proceso de búsqueda de
información (bases de datos sobre todo)

14

You might also like