Đó sẽ là một câu trả lời dài, hãy uống một ly và đọc tiếp…
Hashing là tất cả về việc lưu trữ một cặp khóa-giá trị trong bộ nhớ để có thể đọc và ghi nhanh hơn. Nó lưu trữ các khóa trong một mảng và các giá trị trong một LinkedList.
Giả sử tôi muốn lưu trữ 4 cặp giá trị khóa -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Vì vậy, để lưu trữ các khóa, chúng ta cần một mảng 4 phần tử. Bây giờ làm cách nào để ánh xạ một trong 4 khóa này thành 4 chỉ mục mảng (0,1,2,3)?
Vì vậy, java tìm mã băm của các khóa riêng lẻ và ánh xạ chúng tới một chỉ mục mảng cụ thể. Công thức mã băm là -
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 và cô gái !! Tôi biết bạn đang nghĩ gì. Sự say mê của bạn về bản song ca hoang dã đó có thể khiến bạn bỏ lỡ một điều quan trọng.
Tại sao java lại nhân nó với 31?
Đó là bởi vì, 31 là một số nguyên tố lẻ có dạng 2 ^ 5 - 1. Và số nguyên tố lẻ làm giảm cơ hội Hash Collision
Bây giờ làm thế nào mã băm này được ánh xạ tới một chỉ mục mảng?
câu trả lời là Hash Code % (Array length -1)
,. Vì vậy, “girl”
được ánh xạ đến (3173020 % 3) = 1
trong trường hợp của chúng tôi. là phần tử thứ hai của mảng.
và giá trị “ahhan” được lưu trữ trong LinkedList được liên kết với chỉ mục mảng 1.
HashCollision - Nếu bạn cố gắng tìm hasHCode
các khóa “misused”
và “horsemints”
sử dụng các công thức được mô tả ở trên, bạn sẽ thấy cả hai đều cho chúng ta như nhau 1069518484
. Chàaaa !! bài học kinh nghiệm -
2 đối tượng bằng nhau phải có cùng Mã băm nhưng không có gì đảm bảo nếu Mã băm khớp thì các đối tượng bằng nhau. Vì vậy, nó sẽ lưu trữ cả hai giá trị tương ứng với "lạm dụng" và "đuôi ngựa" vào nhóm 1 (1069518484% 3).
Bây giờ bản đồ băm trông giống như -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
Bây giờ nếu một số nội dung cố gắng tìm giá trị cho khóa “horsemints”
, java sẽ nhanh chóng tìm thấy Mã băm của nó, mô-đun nó và bắt đầu tìm kiếm giá trị của nó trong LinkedList tương ứng index 1
. Vì vậy, theo cách này, chúng ta không cần tìm kiếm tất cả 4 chỉ mục mảng do đó làm cho việc truy cập dữ liệu nhanh hơn.
Nhưng, chờ đã, một giây. có 3 giá trị trong chỉ mục Mảng tương ứng 1 của linkedList, làm thế nào nó phát hiện ra giá trị nào là giá trị cho khóa “đuôi ngựa”?
Thực ra tôi đã nói dối, khi tôi nói HashMap chỉ lưu trữ các giá trị trong LinkedList.
Nó lưu trữ cả cặp giá trị khóa dưới dạng mục nhập bản đồ. Vì vậy, thực tế Bản đồ trông như thế này.
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
Bây giờ bạn có thể thấy Trong khi duyệt qua linkedList tương ứng với ArrayIndex1, nó thực sự so sánh khóa của từng mục nhập của LinkedList đó với “đuôi ngựa” và khi tìm thấy một khóa, nó chỉ trả về giá trị của nó.
Hy vọng bạn đã vui vẻ khi đọc nó :)