Pergunta

Duplicate possíveis:
Como faço para gerar um hashcode a partir de uma matriz de bytes em c #

Em C #, eu preciso criar um hash de uma imagem para garantir que ele é único no armazenamento.

Eu posso facilmente convertê-lo em um array de bytes, mas sem saber como proceder a partir daí.

Existem classes no .NET framework que pode me ajudar, ou alguém que ciente de alguns eficientes algoritmos para criar um hash tão único?

Foi útil?

Solução

Há uma abundância de fornecedores hashsum em .NET que criam hashes criptográficos - que satisifies sua condição de que eles são únicos (por colisão prova da maioria dos fins). Todos eles são extremamente rápido eo hash definitivamente não será o gargalo no seu aplicativo, a menos que você está fazendo isso de um trilhão de vezes.

Pessoalmente eu gosto SHA1:

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

Mesmo quando as pessoas dizem que um método pode ser mais lento do que o outro, é tudo em termos relativos. Um programa de lidar com imagens definitivamente não vai notar o processo microssegundo de gerar um hashsum.

E em relação a colisões, na maioria dos casos isso também é irrelevante. Mesmo métodos "obsoletos", como MD5 ainda são muito úteis na maioria das situações. Apenas recomendamos não usá-lo quando a segurança do seu sistema confia em colisões impedindo.

Outras dicas

Criar nova instância SHA1CryptoServiceProvider cada vez que você precisa para calcular um hash não é rápido em tudo. Usando o mesmo exemplo é bastante rápido.

Ainda assim, eu prefiro fazer um dos muitos algoritmos CRC em vez de um hash criptográfico como funções hash projetadas para criptografia não funcionam muito bem para tamanhos muito pequenos de hash (32 bit), que é o que você quer para o seu GetHash ( ) override (assumindo que é o que você quer).

Confira neste link para fora para um exemplo de computação CRC em C #: http: // livre sanidade- .org / 134 / standard_crc_16_in_csharp.html

P.S. a razão que você quer que seu hash para ser pequena (16 ou 32 bits) é para que você possa compará-los RÁPIDO (que foi toda a ponto de ter hashes, lembra?). Tendo de hash representado por uma de 256 bits valor longo codificado como string é muito louco em termos de desempenho.

Você pode usar qualquer um dos algoritmos de hash padrão, mas hash não pode tecnicamente garantir a unicidade. Hashing é projetado para ser um relativamente rápido e / ou símbolo pequeno para ser capaz de ver se um pedaço de dados provavelmente é o mesmo que o outro. É totalmente possível para completamente diferentes conjuntos de dados para produzir o mesmo hash, embora sendo capaz de produzir estes algoritmos é muito difícil.

Tudo isso de lado, para a verificação da identidade provável, MD5 é bastante rápido. SHA é mais confiável (MD5 foi hackeado, por isso não deve ser usado para segurança), mas também é mais lento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top