Depois de aprender o que é, pensei em escrever uma explicação esperançosamente mais simples por analogia:
Resumo: O que é um código de hash?
- É uma impressão digital. Podemos usar essa impressão digital para identificar pessoas de interesse.
Leia abaixo para mais detalhes:
Pense em um Hashcode como nós tentando identificar alguém de maneira exclusiva
Sou detetive, atento a um criminoso. Vamos chamá-lo de Sr. Cruel. (Ele era um assassino notório quando eu era criança - ele invadiu uma casa sequestrada e matou uma garota pobre, largou o corpo dela e ele ainda está solto - mas isso é um assunto à parte). O senhor Cruel tem certas características peculiares que posso usar para identificá-lo de forma única no meio de um mar de pessoas. Temos 25 milhões de pessoas na Austrália. Um deles é o Sr. Cruel. Como podemos encontrá-lo?
Maus modos de identificar o Sr. Cruel
Aparentemente, o Sr. Cruel tem olhos azuis. Isso não ajuda muito, porque quase metade da população da Austrália também tem olhos azuis.
Boas maneiras de identificar o Sr. Cruel
O que mais posso usar? Eu sei: vou usar uma impressão digital!
Vantagens :
- É realmente muito difícil para duas pessoas ter a mesma impressão digital (não impossível, mas extremamente improvável).
- A impressão digital do Sr. Cruel nunca muda.
- Cada parte de todo o ser do Sr. Cruel: sua aparência, cor do cabelo, personalidade, hábitos alimentares etc. deve (idealmente) refletir-se em sua impressão digital, de modo que, se ele tem um irmão (que é muito parecido, mas não é o mesmo) - então ambos deve ter impressões digitais diferentes . Eu digo "deveria" porque não podemos garantir 100% que duas pessoas neste mundo terão impressões digitais diferentes.
- Mas sempre podemos garantir que o Sr. Cruel sempre terá a mesma impressão digital - e que a impressão digital NUNCA mudará.
As características acima geralmente proporcionam boas funções de hash.
Então, qual é o problema com 'colisões'?
Imagine se eu conseguir uma pista e encontrar alguém que combine com as impressões digitais do Sr. Cruel. Isso significa que eu encontrei o Sr. Cruel?
........possivelmente! Eu devo dar uma olhada mais de perto. Se estou usando o SHA256 (uma função de hash) e estou procurando em uma cidade pequena com apenas 5 pessoas - há uma chance muito boa de encontrá-lo! Mas se eu estiver usando o MD5 (outra famosa função de hash) e verificando impressões digitais em uma cidade com + 2 ^ 1000 pessoas, é uma possibilidade bastante boa que duas pessoas completamente diferentes tenham a mesma impressão digital.
Então, qual é o benefício de tudo isso?
O único benefício real dos códigos de hash é se você deseja colocar algo em uma tabela de hash - e com tabelas de hash você deseja encontrar objetos rapidamente - e é aí que o código de hash entra. Eles permitem que você encontre coisas realmente em tabelas de hash rapidamente. É um truque que melhora enormemente o desempenho, mas com uma pequena despesa de precisão.
Então, vamos imaginar que temos uma tabela de hash cheia de pessoas - 25 milhões de suspeitos na Austrália. Sr. Cruel está em algum lugar lá ... Como podemos encontrá-lo muito rapidamente ? Precisamos resolver todos eles: encontrar uma possível correspondência ou absolver potenciais suspeitos. Você não quer considerar as características únicas de cada pessoa, porque isso levaria muito tempo. O que você usaria em vez disso? Você usaria um código hash! Um código hash pode dizer se duas pessoas são diferentes. Se Joe Bloggs NÃO é o Sr. Cruel. Se as impressões não combinarem, você sabe que definitivamente NÃO é o Sr. Cruel. Mas, se as impressões digitais corresponderementão, dependendo da função de hash usada, as chances já são razoavelmente boas de você encontrar o seu homem. Mas não é 100%. A única maneira de ter certeza é investigar mais: (i) ele / ela teve uma oportunidade / motivo, (ii) testemunhas etc.
Quando você estiver usando computadores se dois objetos tiverem o mesmo valor de código de hash, será necessário investigar novamente se eles são realmente iguais. por exemplo, você teria que verificar se os objetos têm, por exemplo, a mesma altura, o mesmo peso, etc., se os números inteiros são iguais ou se o customer_id é uma correspondência e, em seguida, chegar à conclusão de que são iguais. isso geralmente é feito talvez implementando uma interface IComparer ou IEquality.
Resumo das Chaves
Então, basicamente, um código hash é uma impressão digital.
- Duas pessoas / objetos diferentes podem teoricamente ainda ter a mesma impressão digital. Ou em outras palavras. Se você tem duas impressões digitais iguais ......... elas não precisam ser da mesma pessoa / objeto.
- Além disso, a mesma pessoa / objeto sempre retornará a
mesma impressão digital .
- O que significa que, se dois objetos retornarem códigos de hash diferentes , você terá 100% de certeza de que esses objetos são diferentes.
Demora uns bons 3 minutos para entender o que precede. Talvez leia algumas vezes até que faça sentido. Espero que isso ajude alguém, porque foi preciso muito sofrimento para aprender tudo!