Pregunta

  

Posible duplicado:
   ¿Cómo genero un hashcode? desde una matriz de bytes en c #

En C #, necesito crear un Hash de una imagen para asegurar que sea única en el almacenamiento.

Puedo convertirlo fácilmente en una matriz de bytes, pero no estoy seguro de cómo proceder desde allí.

¿Hay alguna clase en el marco .NET que pueda ayudarme o alguien está al tanto de algunos algoritmos eficientes para crear un hash único?

¿Fue útil?

Solución

Hay muchos proveedores de hashsum en .NET que crean hashes criptográficos, lo que satisface su condición de que son únicos (para la mayoría de los propósitos a prueba de colisiones). Todos son extremadamente rápidos y el hash definitivamente no será el cuello de botella en su aplicación a menos que lo esté haciendo un billón de veces.

Personalmente me gusta SHA1:

string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

Incluso cuando la gente dice que un método podría ser más lento que otro, todo está en términos relativos. Un programa que trata con imágenes definitivamente no notará el proceso de microsegundos de generar un hashsum.

Y con respecto a las colisiones, para la mayoría de los propósitos esto también es irrelevante. Incluso " obsoleto " Los métodos como MD5 siguen siendo muy útiles en la mayoría de las situaciones. Solo recomiende no usarlo cuando la seguridad de su sistema se basa en la prevención de colisiones.

Otros consejos

La parte de la respuesta de Rex M sobre el uso de SHA1 para generar un hash es buena (MD5 también es popular opción). La sugerencia de zvolkov acerca de no crear constantemente nuevos proveedores de criptografía también es buena (al igual que la sugerencia sobre el uso de CRC si la velocidad es más importante que la singularidad virtualmente garantizada.

Sin embargo, no use Encoding.UTF8 .GetString () para convertir un byte [] en una cadena (a menos que, por supuesto, sepa por el contexto que es válido UTF8). Por un lado, rechazará surogates inválidos . Un método que garantiza que siempre le dará una cadena válida de un byte [] es Convertir. ToBase64String () .

Crear una nueva instancia de SHA1CryptoServiceProvider cada vez que necesite calcular un hash NO es nada rápido. Usar la misma instancia es bastante rápido.

Todavía prefiero hacer uno de los muchos algoritmos CRC en lugar de un hash criptográfico, ya que las funciones hash diseñadas para la criptografía no funcionan demasiado bien para tamaños hash muy pequeños (32 bits), que es lo que desea para su GetHash ( ) anular (asumiendo que eso es lo que quieres).

Consulte este enlace para ver un ejemplo de cómo calcular el CRC en C #: http: // sanity-free .org / 134 / standard_crc_16_in_csharp.html

P.S. la razón por la que desea que su hash sea pequeño (16 o 32 bits) es para que pueda compararlos RÁPIDO (ese era el punto de tener hash, ¿recuerda?). Tener hash representado por un valor de 256 bits codificado como cadena es bastante loco en términos de rendimiento.

Puede usar cualquiera de los algoritmos de hash estándar, pero técnicamente el hashing no puede garantizar la unicidad. El hash está diseñado para ser un token relativamente rápido y / o pequeño para poder ver si un dato es probablemente el mismo que el otro. Es completamente posible que conjuntos de datos completamente diferentes produzcan el mismo hash, aunque poder producirlos algorítmicamente es muy difícil.

Dejando eso de lado, para verificar la identidad probable, MD5 es bastante rápido. SHA es más confiable (MD5 ha sido pirateado, por lo que no debe usarse para seguridad), pero también es más lento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top