Es wird eine lange Antwort sein, etwas trinken und weiterlesen ...
Beim Hashing geht es darum, ein Schlüssel-Wert-Paar im Speicher zu speichern, das schneller gelesen und geschrieben werden kann. Es speichert Schlüssel in einem Array und Werte in einer LinkedList.
Nehmen wir an, ich möchte 4 Schlüsselwertpaare speichern -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Um die Schlüssel zu speichern, benötigen wir ein Array mit 4 Elementen. Wie ordne ich nun einen dieser 4 Schlüssel 4 Array-Indizes (0,1,2,3) zu?
Java findet also den HashCode einzelner Schlüssel und ordnet sie einem bestimmten Array-Index zu. Hashcode-Formeln sind -
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 und Mädchen !! Ich weiß was du denkst. Ihre Faszination für dieses wilde Duett könnte dazu führen, dass Sie eine wichtige Sache verpassen.
Warum Java multipliziert es mit 31?
Es ist, weil 31 eine ungerade Primzahl in der Form 2 ^ 5 - 1 ist. Und ungerade Primzahlen verringern die Wahrscheinlichkeit einer Hash-Kollision
Wie wird dieser Hash-Code nun einem Array-Index zugeordnet?
Antwort ist , Hash Code % (Array length -1)
. Ist “girl”
also (3173020 % 3) = 1
in unserem Fall abgebildet . Das ist das zweite Element des Arrays.
und der Wert "ahhan" wird in einer LinkedList gespeichert, die dem Array-Index 1 zugeordnet ist.
HashCollision - Wenn Sie versuchen, hasHCode
die Schlüssel zu finden “misused”
und “horsemints”
die oben beschriebenen Formeln zu verwenden, sehen Sie, dass beide uns dasselbe geben 1069518484
. Whooaa !! Lektion gelernt -
2 gleiche Objekte müssen denselben Hashcode haben, es gibt jedoch keine Garantie dafür, dass die Objekte gleich sind, wenn der Hashcode übereinstimmt. Daher sollten beide Werte, die "missbraucht" und "Horsemints" entsprechen, in Bucket 1 (1069518484% 3) gespeichert werden.
Jetzt sieht die Hash-Karte aus wie -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
Wenn nun ein Körper versucht, den Wert für den Schlüssel zu finden “horsemints”
, findet Java schnell den Hashcode des Schlüssels , moduliert ihn und beginnt mit der Suche nach seinem Wert in der entsprechenden LinkedList index 1
. Auf diese Weise müssen wir nicht alle 4 Array-Indizes durchsuchen, um den Datenzugriff zu beschleunigen.
Aber warte, eine Sekunde. Es gibt 3 Werte in dieser linkedList, die dem Array-Index 1 entsprechen. Wie wird herausgefunden, welcher der Werte für die Schlüssel-Horsemints war?
Eigentlich habe ich gelogen, als ich sagte, dass HashMap nur Werte in LinkedList speichert.
Es speichert beide Schlüsselwertpaare als Karteneintrag. Map sieht also tatsächlich so aus.
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
Jetzt können Sie sehen, dass beim Durchlaufen der mit ArrayIndex1 entsprechenden verknüpften Liste tatsächlich der Schlüssel jedes Eintrags mit dieser verknüpften Liste mit „Horsemints“ verglichen wird. Wenn eine gefunden wird, wird nur der Wert zurückgegeben.
Hoffe du hattest Spaß beim Lesen :)