Professional Documents
Culture Documents
FACULTAD DE INGENIERIA
ESCUELA DE COMPUTACION
UNIDAD V. TECNICA HASHING
METODOS DE ORDENACIÓN
1. Introducción
Ordenar significa permutar estos elementos de tal forma que los mismos queden de acuerdo con una
distribución preestablecida.
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.
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.
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
2
PRIMERA PASADA:
Debe observarse que el elemento más pequeño, en este caso 08, fue situado en la parte izquierda del
arreglo.
SEGUNDA PASADA:
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).
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
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
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
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).
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
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.
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
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.
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.
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”.
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.
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:
8
Lo que antes hemos denominado colisión.
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
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
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.
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:
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:
10
h(257135) = 257 + 531 = 788
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:
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
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
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
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
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:
• Usos
– Tablas de Hash= tablas de índices que agilizan el proceso de búsqueda de
información (bases de datos sobre todo)
14