Mapa de bits de código hash
El cálculo de la de código hash de la imagen de C # es útil en muchos procesamiento de imágenes aplicaciones. Un código hash puede ser usado para comparar dos imágenes de la iguales o se puede utilizar para asegurarse de que sigue sin modificar una imagen. Como veremos, el cálculo del código hash de un mapa de bits no es diferente de obtener el valor hash de cualquier pieza de datos.
¿Qué es un código hash
Un código hash es un valor generado por un valor inicial por separado (el valor inicial). Un código hash es generalmente una longitud fija de datos de cualquier tamaño dado. Así, por ejemplo, si estamos hablando de bytes, un valor semilla que es de 1 byte de longitud y un valor semilla que es de 300 bytes de longitud se traducirá en un valor hash de la misma longitud.
Como puede imaginar, esto significa que es posible que los dos valores semilla diferente a tener el mismo valor hash. (No hay pruebas de matemáticas complicadas para esto, pero sólo pensar en ello, no es demasiado difícil de entender cómo ocurre esto). Cuando dos valores diferentes de semillas como resultado el mismo valor hash, que se llama una colisión.
Aquí es donde se introduce el concepto de algoritmos de hash. Un algoritmo hash, tal como se usa comúnmente con la cifrado de datos, Es un proceso que toma un valor de semilla y lo transforma en un valor hash. Los buenos algoritmos de utilizar las propiedades matemáticas determinadas para minimizar la probabilidad de colisiones. Más comunes son los algoritmos MD5 y SHA algoritmos hash. Estos algoritmos son muy buenos en la reducción del número de colisiones.
Por supuesto, hay un montón de algoritmos hash, algunos mejores que otros. SHA por ejemplo, es una familia de muchos algoritmos diferentes, no un algoritmo único. Para aquellos interesados en el tema, a partir de principios de 2010, hay un concurso público para crear el nuevo Algoritmo SHA-3.
Afortunadamente para los desarrolladores de C #,. NET Framework viene con la aplicación de amplio uso algoritmos hash.
Código hash de una imagen
Entonces, ¿cómo se calcula el código hash de una imagen? El truco consiste en recordar que una imagen se almacena en un ordenador en bits, igual que cualquier otra pieza de datos. Si podemos lograr que los bytes que representan la imagen dada, podemos calcular el valor hash de los bytes. Mientras la imagen a la transformación de byte es coherente, el valor hash resultante será siempre la misma para una determinada imagen.
Nota importante: Cada objeto en. NET tiene una función GetHashCode() Algunas personas sienten la tentación de hacer algo como esto:
Bitmap myImage = new Bitmap(10, 10);
int hash = myImage.GetHashCode();
Esto no trabajo. Al menos no en el propósito de procesamiento de imágenes. ¿Por qué? Debido a que el GetHashCode función devolverá un valor hash para el mapa de bits objeto. Esto se usa en programación C# para comparar, cuando dos referencias apuntan al mismo objeto (ya que devolverá el mismo valor de hash calculado sobre el objeto). Es posible que tenga dos imágenes distintas que son idénticos, sino porque la están representados por un objeto, el GetHashCode valores serán completamente diferentes. ejemplo de Mapa de bits Hash C#
En primer lugar vamos a crear una imagen simple:
using System.Drawing; Bitmap simpleImage = new Bitmap(30, 30);
using (Graphics g = Graphics.FromImage(simpleImage))
{
g.Clear(Color.Red);
}
El resultado es una es una imagen simple cuadrado de 30 píxeles por 30 píxeles es resultado es un cuadrado rojo.esto no es una imagen pero recuerde que el hash funciona con cualquier imagen.
Ahora que tenemos el mapa de bits, necesitamos los datos en bruto de bytes. Vamos a utilizar un método simple de la imagen a bytes.
ImageConverter converter = new ImageConverter();
byte[] rawImageData = converter.ConvertTo(simpleImage, typeof(byte[])) as byte[];
Habida cuenta de que tenemos el byte de datos (de alguna manera), ahora podemos calcular el valor de hash:
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hash = md5.ComputeHash(rawImageData);
En este caso hemos utilizado el algoritmo MD5. Puede, por supuesto,puede utiliza otros algoritmos. Mientras mantiene estas dos cosas coherentes: a) la funcion de imagen a byte y b) el algoritmo de hash, el valor hash de una determinada imagen siempre será la misma.