Vai ser uma resposta longa, pegue uma bebida e continue a ler…
Hashing é armazenar um par de valores-chave na memória que pode ser lido e gravado mais rapidamente. Ele armazena chaves em uma matriz e valores em uma LinkedList.
Vamos dizer que eu quero armazenar 4 pares de valores-chave -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Então, para armazenar as chaves, precisamos de uma matriz de 4 elementos. Agora, como mapeio uma dessas 4 chaves para 4 índices de matriz (0,1,2,3)?
Portanto, o java encontra o hashCode de chaves individuais e mapeia-as para um índice de matriz específico. Hashcode Formulas é -
1) reverse the string.
2) keep on multiplying ascii of each character with increasing power of 31 . then add the components .
3) So hashCode() of girl would be –(ascii values of l,r,i,g are 108, 114, 105 and 103) .
e.g. girl = 108 * 31^0 + 114 * 31^1 + 105 * 31^2 + 103 * 31^3 = 3173020
Hash e garota !! Eu sei o que você está pensando. Seu fascínio por esse dueto selvagem pode fazer você perder uma coisa importante.
Por que o java multiplica por 31?
É porque, 31 é um primo ímpar na forma 2 ^ 5 - 1. E o prime ímpar reduz a chance de Hash Collision
Agora, como esse código de hash é mapeado para um índice de matriz?
resposta é Hash Code % (Array length -1)
,. Então, “girl”
é mapeado (3173020 % 3) = 1
no nosso caso. que é o segundo elemento da matriz.
e o valor "ahhan" é armazenado em um LinkedList associado ao índice de matriz 1.
HashCollision - Se você tentar encontrar hasHCode
as chaves “misused”
e “horsemints”
usar as fórmulas descritas acima, verá as duas nos dando o mesmo 1069518484
. Whooaa !! Lição aprendida -
2 objetos iguais devem ter o mesmo hashCode, mas não há garantia se o hashCode corresponder, então os objetos serão iguais. Portanto, ele deve armazenar os dois valores correspondentes a "mal utilizado" e "horsemints" no intervalo 1 (1069518484% 3).
Agora o mapa de hash se parece com -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
Agora, se algum corpo tentar encontrar o valor da chave “horsemints”
, o java encontrará rapidamente o hashCode, modulá-lo e começará a procurar por seu valor no LinkedList correspondente index 1
. Portanto, dessa forma, não precisamos pesquisar todos os quatro índices da matriz, tornando o acesso aos dados mais rápido.
Mas espere, um segundo. existem 3 valores nesse indexList correspondente do array 1 da linkedList; como ele descobre qual deles foi o valor dos principais "horsemints"?
Na verdade, eu menti, quando disse que o HashMap apenas armazena valores no LinkedList.
Ele armazena o par de valores-chave como entrada do mapa. Então, na verdade, o Mapa se parece com isso.
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
Agora você pode ver. Enquanto percorre o LinkedList correspondente a ArrayIndex1, ele realmente compara a chave de cada entrada desse LinkedList a "horsemints" e, quando encontra um, apenas retorna o valor dele.
Espero que você tenha se divertido durante a leitura :)