Transformacion de Claves
Transformacion de Claves
Transformacion de Claves
Materia: Programación
Grupo: 4 INTRODUCCIÓN
El método hash consiste en facilitar la forma de encontrar los datos en los arreglos En
consecuencia, las aplicaciones h(k), a las que desde ahora llamaremos funciones hash,
tienen la particularidad de que podemos esperar que h( ki ) = h( kj ) para bastantes pares
distintos ( ki,kj ). El objetivo será pues encontrar una función hash que provoque el
menor número posible de colisiones (ocurrencias de sinónimos), aunque esto es solo un
INTRODUCCIÓN
El método hash consiste en facilitar la forma de encontrar los datos en los arreglos En
consecuencia, las aplicaciones h(k), a las que desde ahora llamaremos funciones hash, tienen
la particularidad de que podemos esperar que h(ki ) = h( kj ) para bastantes pares distintos (
ki,kj ). El objetivo será pues encontrar una función hash que provoque el menor número
posible de colisiones (ocurrencias de sinónimos), aunque esto es solo un aspecto del
problema, el otro será el de diseñar métodos de resolución de colisiones cuando éstas
se produzcan.
Se trata de abordar de forma sencilla este concepto para aquellos que no lo conozcan.
Podemos decir que un HASH no es más que un número o resumen. De hecho, esta es
solo una herramienta más que se puede implementar a los arreglos, se puede decir
que un fichero es como un flujo de bits y le aplicamos un algoritmo de HASH lo que
obtenemos es otro conjunto de bits (de longitud fija y que depende del número de bits
de salida del algoritmo o función que utilicemos) que depende bit a bit del contenido
del flujo original de bits que sirvió como entrada al algoritmo.
Además, cumplen las siguientes 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, en el
RSA).
1. Una función hash que sea fácil de calcular y que distribuya uniformemente las
claves.
2. Un método para resolver colisiones. Si estas se presentan se debe contar con
algún método que genere posiciones alternativas
2
1. proteger la confidencialidad de una contraseña
2. garantizar la integridad de los datos
3. verificar la identidad del emisor de un mensaje mediante firmas digitales
ALGORITMO HASHING
Algoritmo que se utiliza para generar un valor de Hash para algún dato, como por
ejemplo claves. Un algoritmo de Hash hace que los cambios que se produzcan en los
datos de entrada provoquen cambios en los bits del Hash. Gracias a esto, los Hash
permiten detectar si un dato ha sido modificado. (Vilugron, 2014)
Ventajas Desventajas
No se requiere almacenamiento adicional Solo permite acceso por una sola llave.
para los índices.
• Costos
TABLAS HASH
Las tablas hash son estructuras tipo vector que ayudan a asociar claves con valores o
datos.
Observación:
3
No se debe buscar directamente el valor deseado, sino a través de una función de
dispersión h(x) localizar la posición del valor buscado. (Olmos, 2014)
Para el diseño de una tabla hash, es de gran importancia cumplir con lo siguiente:
5
Truncamiento
El truncamiento consiste en tomar algunos dígitos de la clave y con estos formar una
posición en un array. Se ignora parte de la clave para con el resto formar un índice de
almacenamiento.
La idea consiste en tener un listado de números, seleccionar por ejemplo la posición 2,
4 y 5; para así tener una posición en donde poder almacenar la clave. Llevando esto a
un ejemplo práctico.
5700931 703
3498610 481
0056241 064
9134720 142
5174829 142
Lo positivo del truncamiento y una de las ventajas por sobre otros métodos de
búsqueda y ordenamiento es que no solo funciona con valores numéricos, también
funciona con caracteres alfabéticos, esto se puede aplicar de dos formas:
1) Transformar cada carácter en un número asociado a su posición en el
abecedario.
2) Transformar cada carácter en un número asociado a su valor según el código
ASCII.
6
MÉTODOS DE TRATAMIENTO DE COLISIONES
Algunos métodos más utilizados para resolver colisiones son los siguientes:
• Reasignación
• Arreglos anidados
• Áreas de desborde
Reasignación
• Prueba lineal
• Prueba cuadrática
• Doble dirección hash
Prueba Cuadrática
Este método es similar al de la prueba lineal. La diferencia consiste en que en el
cuadrático las direcciones alternativas se generan como D + 1, D + 4, D + 9, . . ., D + i² en
vez de D + 1, D + 2,...,D + i. “La principal desventaja de este método es que pueden
quedar casillas del arreglo sin visitar”. (Takeyas, 2012)
Además, como los valores de las direcciones varían en 1² unidades, resulta difícil
determinar una condición general para detener el ciclo. Este problema podría
solucionarse empleando una variable auxiliar, cuyos valores dirijan el recorrido del
arreglo de tal manera que garantice que serán visitadas todas las casillas. A
continuación, se presenta un ejemplo que ilustra el funcionamiento:
7
Este método se genera a partir de la elevación de un valor al cuadrado, donde ese
valor inicia con el número 1 y lo suma a la dirección que se encuentra en colisión (d+i 2),
si se genera nuevamente una colisión el valor del número se incrementa, se eleva al
cuadrado y se suma a la dirección inicial (d+1, d+4, d+9, d+16, …, d+i2), este proceso se
repite hasta que se encuentre una dirección vacía. “Está generación de direcciones
puede llegar a exceder el tamaño de la estructura, si es así, la dirección inicia en uno y
el valor inicial a elevar es el cero”. (Takeyas, 2012)
Este método es similar al de la prueba lineal. La diferencia consiste en que, en lugar
de buscar en las posiciones con direcciones: dir_Hash, dir_Hash + 1, dir_Hash + 2,
dir_Hash + 3, .... { buscamos linealmente en las posiciones con direcciones: dir_Hash,
dir_Hash + 1, dir_Hash + 4, dir_Hash + 9, ..., dir_Hash+i 2 { Si el número m de
posiciones en la tabla T es un número primo y el factor de carga no excede del 50%,
sabemos que siempre insertaremos el nuevo elemento X y que ninguna celda será
consultada dos veces durante un acceso.
Desventaja:
• Pueden quedar casillas sin visitar, además resulta difícil definir una condición
general para detener el ciclo.
• Se puede utilizar una variable auxiliar, que dirija el recorrido de tal forma que
garanticen que serán visitadas todas las casillas. (Fidalgo., 2013)
Ejemplo:
V=[25, 43, 56, 35, 54, 13, 80, 104, 55]
Usando la función hash:
H(K)= (k mod 10) + 1
{Este algoritmo busca el dato con clave K en el arreglo V de N elementos. Resuelve el problema de las
colisiones por medio de la prueba cuadrática}
{ D, DX e I son variables de tipo entero}
1. D=H[K] {Genera dirección}
2. Si (V[D] == K) entonces
Escribir “El elemento esta en la posición D”
Si no
2
Hacer I = 1 y DX = D + I ;
2.1 Repetir mientras (V[DX] <> K) y (V[DX]<>VACÍO)
2
Hacer I = I + 1; DX = D + I ;
2.1.1 Si (DX > N)
Entonces Hacer I=0; DX=1 y D=1;
2.1.2 {Fin del paso 2.1.1}
2.2{fin del ciclo del paso 2.1}
2.3 Si (V[DX] == K) entonces
Escribir “El elemento esta en la posición DX”
Si no
8
Escribir “El elemento no está en el arreglo”
2.4{ Fin del condicional del paso 2.3}
3 {Fin del condicional del paso 2}
Código. Prueba Cuadrática.
public static int pruebaCuadratica(int X, int[] A){
int m = A.length;
int dirHash = X%m;
if (A[dirHash] == X) return dirHash;
else {
int i = 1;
int cont = 0;
int dirReh = (dirHash + 1)%m;
while ((A[dirReh] != X) && (A[dirReh] != 0) && (cont < m*10))
{
i++;
dirReh = (dirHash + (i*i))%m;
cont++;
}
if (A[dirReh] == X) return dirReh;
else return -1;
}
}
9
el tamaño del array. Y se obtienen unos resultados mejores cuando el tamaño del
array es un número primo
Ejemplo:
V=[25, 43, 56, 35, 54, 13, 80, 104]
H(K)= (k mod 10) +1
{Este algoritmo busca el dato con clave K en el arreglo V de N elementos. Resuelve el problema de las
colisiones por medio de la doble dirección hash}
{ D y DX son variables de tipo entero}
1. D=H[K] {Genera dirección}
2. Si (V[D] == K) entonces
Escribir “El elemento esta en la posición D”
Si no
Hacer DX = H’ (D);
2.1 Repetir mientras (DX <=N) y (V[DX]<> K) y (V[DX]<>VACÍO) y (DX<>D)
Hacer DX = H’ (DX) ;
2.2{fin del ciclo del paso 2.1}
2.3 Si (V[DX] == K) entonces
Escribir “El elemento esta en la posición DX”
Si no
Escribir “El elemento no está en el arreglo”
2.4{ Fin del condicional del paso 2.3}
3 {Fin del condicional del paso 2}
10
int dirHash2 = R – (X%R);
int i = 1;
int dirReh = (dirHash + dirHash2)%m;
while ((A[dirReh] != X) && (A[dirReh] != 0) )
{
i++;
dirReh = (dirHash + i*dirHash2)%m;
}
if (A[dirReh] == X) return dirReh;
else return -1;
}
}
Arreglos Anidados
Arreglos anidados Este método consiste en que cada elemento del arreglo tenga otro
arreglo en el cual se almacena los elementos colisionados. Si bien la solución parece
ser sencilla, es claro también que resulta ineficiente. Al trabajar con arreglos se
depende del espacio que se halla asignado a este lo cual conduce a un nuevo problema
difícil de solucionar: elegir un tamaño adecuado de arreglo que permita el equilibrio
entre el coste de memoria y el número de valores colisionados que pudiera almacenar.
(fernandez, 2010)
En cada elemento del arreglo tenga otro arreglo, donde se almacenan los elementos
colisionados
1. Solución ineficiente
2. costo de memoria
3. Número de valores colisionados
11
Ejemplo:
V = [25, 43, 56, 35, 54, 13, 80, 104]
Usando la función hash:
H(K)= (k mod 10) +1
80 - - - - - - 43 54 25 56 - - - - - 13 104 35 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
80 - - - -
- - - - -
- - - - -
43 13 - - -
54 104 - - -
25 35 - - -
56 - - - -
- - - - -
- - - - -
- - - - -
Encadenamiento
Cada elemento del arreglo tiene un apuntador a una lista ligad, la cual se ira generando
e ira almacenando los valores colisionados. (takeyas, 2012)
Es un método eficiente debido al dinamismo de las listas
DESVENTAJAS
➢ Ocupa un espacio adicional al de la tabla
➢ Requiere un manejo de lista ligada
➢ Si la lista crece demasiado se pierde el acceso directo del método hash
Ejemplo:
V=[ 25, 43, 56, 35, 54, 13, 80, 104 ]
Almacenados usando la función hash:
H(K)= (k mod 10) +1
12
CONCLUSIONES
• Una tabla hash es una estructura de datos que soporta la recuperación,
eliminación e inserción de elementos de forma muy rápida.
• Las tablas hash permiten que el coste medio de las operaciones insertar, buscar
y eliminar sea constante, siempre que el factor de carga no sea excesivo para
reducir la probabilidad de colisión.
• Una función hash debe ser fácilmente calculable, sin costosas operaciones,
también debe tener una buena distribución de valores entre todas los
componentes de la tabla.
• Una buena función hash distribuye equitativamente la asignación de claves a
través de las posiciones de la tabla hash.
• Si la función está mal diseñada producirá muchas colisiones.
• La fortaleza de una función hash requiere que estas colisiones sean las mínimas
posibles y que encontrarlas sea lo más difícil posible.
RECOMENDACIONES
• Tome en cuenta los requisitos para elaborar una buena tabla hash.
• Escoja el tipo de tabla adecuado para nuestro algoritmo.
• Trate de que el número de colisiones sea casi nulo.
• En caso de que existan colisiones opte por el método de tratamiento más
adecuado para su algoritmo.
13