Tôi muốn nghe ý kiến của cộng đồng về cách tôi nên thực hiện GetHashCode (hoặc ghi đè lên nó) cho đối tượng của tôi. Tôi hiểu rằng tôi cần phải làm như vậy nếu tôi ghi đè phương thức equals. Tôi đã thực hiện nó một số tiền hợp lý của thời gian, đôi khi chỉ cần gọi phương thức cơ sở. Tôi hiểu rằng đối tượng của tôi phải bằng một thể hiện khác của đối tượng nếu nó chứa cùng một chi tiết (các thành viên). Cách tốt nhất để lấy mã băm từ các thành viên của lớp là gì?Thực hiện GetHashCode chính xác
Trả lời
Hãy nói rằng lớp học của bạn trông như thế này:
class Frob {
public string Foo { get; set; }
public int Bar { get; set; }
public double FooBar { get; set; }
}
Hãy nói rằng bạn xác định bằng để hai trường hợp của Frob
đều bình đẳng nếu họ Foo
và Bar
họ đều bình đẳng, nhưng FooBar
không quan trọng.
Sau đó, bạn nên xác định GetHashCode
về mặt số Foo
và Bar
. Một cách là như sau:
return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode();
Về cơ bản, bạn chỉ muốn kết hợp tất cả các trường đi vào xác định sự bình đẳng. Một cách là chỉ tiếp tục tích lũy và nhân với 17 như tôi đã làm. Nó rất nhanh, nó đơn giản, nó chính xác, và nó thường cho một bản phân phối tốt.
Tôi có cảm giác đây là một câu hỏi, nhưng tại sao lại là 23? –
Yếu tố chính để tạo ra {2,1} và {1,2} khác nhau. –
có thể chỉ ra rằng GetHashCode chỉ cho bạn biết nếu hai đối tượng ** có thể ** được coi là bằng nhau không. Vẫn có khả năng xảy ra va chạm băm. – geofftnz
Cân nhắc việc đóng dưới dạng bản sao của http://stackoverflow.com/a/720282/93922 –
Trước khi bạn thực hiện việc này, tôi khuyên bạn nên đọc và hiểu bài viết của tôi trên đó: http://blogs.msdn.com/b /ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –
Cảm ơn, tôi hiểu rằng đây có thể là một câu hỏi phổ biến và tôi nên thực hiện thêm một chút săn lùng xung quanh. Cảm ơn sự giúp đỡ của bạn – Zivka