Các hashCode()
phương pháp của lớp Boolean được thực hiện như thế này:
public int hashCode() {
return value ? 1231 : 1237;
}
Tại sao nó sử dụng 1231 và 1237? Tại sao không phải cái gì khác?
Các hashCode()
phương pháp của lớp Boolean được thực hiện như thế này:
public int hashCode() {
return value ? 1231 : 1237;
}
Tại sao nó sử dụng 1231 và 1237? Tại sao không phải cái gì khác?
Câu trả lời:
1231 và 1237 chỉ là hai số nguyên tố tùy ý (đủ lớn) . Bất kỳ hai số nguyên tố lớn nào khác đều tốt.
Tại sao lại là số nguyên tố?
Giả sử trong một giây mà chúng tôi chọn các số tổng hợp (không phải số nguyên tố), giả sử là 1000 và 2000. Khi chèn các boolean vào bảng băm, true và false sẽ đi vào bucket 1000 % N
resp 2000 % N
(ở đó N
là số nhóm).
Bây giờ hãy để ý rằng
1000 % 8
cùng một thùng như 2000 % 8
1000 % 10
cùng một thùng như 2000 % 10
1000 % 20
cùng một thùng như 2000 % 20
nói cách khác, nó sẽ dẫn đến nhiều va chạm .
Điều này là do thừa số của 1000 (2 3 , 5 3 ) và thừa số của năm 2000 (2 4 , 5 3 ) có rất nhiều thừa số chung. Do đó, các số nguyên tố được chọn, vì chúng không có khả năng có bất kỳ thừa số chung nào với kích thước nhóm.
Tại sao số nguyên tố lớn . 2 và 3 sẽ không làm gì?
Khi tính toán mã băm cho các đối tượng hỗn hợp, thông thường sẽ thêm mã băm cho các thành phần. Nếu các giá trị quá nhỏ được sử dụng trong một tập hợp băm với số lượng lớn các nhóm thì có nguy cơ dẫn đến sự phân bố các đối tượng không đồng đều.
Va chạm có quan trọng không? Boolean chỉ có hai giá trị khác nhau?
Bản đồ có thể chứa boolean cùng với các đối tượng khác. Ngoài ra, như Drunix đã chỉ ra, một cách phổ biến để tạo các hàm băm của các đối tượng hỗn hợp là sử dụng lại các triển khai mã băm của các thành phần con, trong trường hợp đó, tốt hơn là trả về các số nguyên tố lớn.
Câu hỏi liên quan:
2*1231 = 2462
nhóm. Có phải va chạm là một vấn đề trong tình huống như vậy?