2012-01-25 46 views
45

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

+2

Cân nhắc việc đóng dưới dạng bản sao của http://stackoverflow.com/a/720282/93922 –

+2

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 –

+0

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

Trả lời

34

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ọ FooBar 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ố FooBar. 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.

+5

Tôi có cảm giác đây là một câu hỏi, nhưng tại sao lại là 23? –

+1

Yếu tố chính để tạo ra {2,1} và {1,2} khác nhau. –

+6

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ác vấn đề liên quan