xem xét lớp này:hàm băm hoàn hảo và lợi ích
public final class MyDate {
private int year, month, day;
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
//Some stuff
@Override
public int hashCode() {
return ((year << 4) | month) << 5 | day;
}
}
Đây là một hàm băm hoàn hảo bởi vì trong ký ức chúng ta có:
Vì vậy, trong màu đỏ, 5 bits
cửa hàng ngày (1 đến 31), trong màu vàng 4 bits
lưu trữ tháng (1 đến 12) và các cửa hàng khác lưu trữ năm (1 đến 16777215).
Lợi ích của việc hoàn hảo hashFunction
là gì? AFAIK, nó có thể đảm bảo việc thêm/xóa/chứa trong O(1)
trong một HashSet
nhưng tôi có thể nhận được lợi ích khác của việc có một?
Tôi thấy rằng nhiều hàm băm sử dụng số nguyên tố, cách tốt nhất để xây dựng một số là gì (tôi tưởng tượng rằng việc tạo một hàm băm hoàn hảo là không phổ biến/hiếm)?
EDIT:
Về số nguyên tố -> trả lời here
hàm băm hoàn hảo của bạn chỉ hữu ích nếu mảng băm bên dưới có kích thước để phù hợp với tất cả các giá trị có thể (không chắc với jdk HashSet/HashMap). – jtahlborn
Tôi không hiểu: tại sao lại đặt ngày trong một bộ băm khi tôi có thể dễ dàng tạo một bản sao mới khi cần? – Andy
@Andy Đó là một ví dụ – user2336315