2010-05-22 29 views
9

thể trùng lặp:
What is the best algorithm for an overridden System.Object.GetHashCode?thực hiện GetHashCode

Cái gì tạo nên thực hiện tốt các phương pháp GetHashCode? Tôi đã làm một số googling, và tìm thấy một số goodlines (MSDN) nhưng nó có vẻ như logic chỉ thao tác hai số được lưu trữ như là các lĩnh vực trong lớp. Liệu logic thực tế này có đơn giản để thực hiện phương pháp này không?

Trả lời

34

Yêu cầu tối thiểu là mã băm phải giống nhau cho bất kỳ giá trị cụ thể nào. Vì vậy, thực hiện các công trình này, nhưng sự phân bố là khủng khiếp:

public override int GetHashCode() { 
    return 1; 
} 

Để làm việc tốt nhất, các mã băm nên xem xét tất cả các dữ liệu có liên quan trong đối tượng và được phân phối đồng đều nhất có thể trong phạm vi số nguyên.

Triển khai thực hiện xem xét tất cả thành viên, nhưng không phân phối rất tốt có thể được tìm thấy trong cấu trúc System.Drawing.Point. Nó sử dụng XOR để kết hợp các bit trong các thành viên, có nghĩa là tất cả các điểm trong đó X và Y đều bình đẳng lấy mã băm zero:

public override int GetHashCode() { 
    return this.X^this.Y; 
} 

Một cách để có được một bản phân phối tốt hơn là để nhân một thành viên của một số nguyên tố số và thêm thành viên tiếp theo, lặp lại khi cần:

public override int GetHashCode() { 
    return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3; 
} 

Phương pháp tương tự đã được sử dụng trong các trình tạo ngẫu nhiên đơn giản vì nó phân tán các giá trị khá tốt.

+0

Một số điểm thực sự tốt ở đó. Cảm ơn! – dotnetdev

Các vấn đề liên quan