Ini akan menjadi jawaban yang panjang, minum dan baca terus ...
Hashing adalah tentang menyimpan pasangan nilai kunci dalam memori yang dapat dibaca dan ditulis lebih cepat. Ini menyimpan kunci dalam array dan nilai-nilai dalam LinkedList.
Katakanlah saya ingin menyimpan 4 pasangan nilai kunci -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Jadi untuk menyimpan kunci, kita membutuhkan array 4 elemen. Sekarang bagaimana cara memetakan salah satu dari 4 kunci ini ke 4 indeks array (0,1,2,3)?
Jadi java menemukan kode hash kunci individu dan memetakannya ke indeks array tertentu. Rumus Hashcode adalah -
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 and girl !! Saya tahu apa yang Anda pikirkan. Ketertarikan Anda tentang duet liar itu mungkin membuat Anda kehilangan hal penting.
Mengapa java mengalikannya dengan 31?
Itu karena, 31 adalah prime aneh dalam bentuk 2 ^ 5 - 1. Dan prime prime mengurangi kemungkinan Hash Collision
Sekarang bagaimana kode hash ini dipetakan ke indeks array?
jawabannya adalah Hash Code % (Array length -1)
,. Jadi “girl”
dipetakan ke (3173020 % 3) = 1
dalam kasus kami. yang merupakan elemen kedua dari array.
dan nilai "ahhan" disimpan dalam LinkedList yang terkait dengan indeks array 1.
HashCollision - Jika Anda mencoba menemukan hasHCode
kunci “misused”
dan “horsemints”
menggunakan formula yang dijelaskan di atas Anda akan melihat keduanya memberi kami sama 1069518484
. Whooaa !! pelajaran yang dipetik -
2 objek yang sama harus memiliki kode hash yang sama tetapi tidak ada jaminan jika kode hash cocok dengan objek yang sama. Jadi itu harus menyimpan kedua nilai yang sesuai dengan "disalahgunakan" dan "horsemints" ke bucket 1 (1069518484% 3).
Sekarang peta hash terlihat seperti -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
Sekarang jika beberapa badan mencoba menemukan nilai untuk kunci “horsemints”
, java dengan cepat akan menemukan kode hash itu, modul itu dan mulai mencari nilainya di LinkedList yang sesuai index 1
. Jadi dengan cara ini kita tidak perlu mencari semua indeks 4 array sehingga membuat akses data lebih cepat.
Tapi, tunggu, sebentar. ada 3 nilai dalam tertaut terkait Array indeks 1, bagaimana ia mengetahui mana yang merupakan nilai untuk "horsemints" kunci?
Sebenarnya saya berbohong, ketika saya mengatakan HashMap hanya menyimpan nilai dalam LinkedList.
Ini menyimpan kedua pasangan nilai kunci sebagai entri peta. Jadi sebenarnya Map terlihat seperti ini.
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
Sekarang Anda dapat melihat Saat melintasi melalui LinkedList yang sesuai dengan ArrayIndex1, ia sebenarnya membandingkan kunci dari setiap entri dari LinkedList itu dengan “horsemints” dan ketika ia menemukannya, ia hanya mengembalikan nilai itu.
Semoga Anda bersenang-senang saat membacanya :)