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
- 1. thực hiện GetHashCode
- 2. Thực hiện chính xác min
- 3. Việc triển khai chính xác cho GetHashCode() cho các lớp thực thể là gì?
- 4. numpy.apply_along_axis thực hiện chính xác điều gì?
- 5. AFX_MANAGE_STATE (AfxGetStaticModuleState()) thực hiện chính xác
- 6. Cách chính xác để thực hiện ThreadPool.RegisterWaitForSingleObject
- 7. cách chính xác để thực hiện jQuery với require.js
- 8. Cài đặt "RAILS_GEM_VERSION" thực hiện chính xác điều gì?
- 9. Thực hiện khớp CHÍNH XÁC trên tìm kiếm SOLR
- 10. thực hiện chính xác các bộ so sánh xương sống
- 11. Powershell: Thực hiện chính sách
- 12. Khi nào chúng ta thực hiện GetHashCode() cho một từ điển?
- 13. Ghi đè GetHashCode
- 14. Cách xác minh rằng dấu thời gian được thực hiện chính xác cho mã đã ký
- 15. IEqualityComparer <double> với dung sai; làm thế nào để thực hiện GetHashCode?
- 16. GetHashCode() với^
- 17. Biểu hiện chính xác tiêu cực lookahead
- 18. GetHashCode() từ booleans chỉ
- 19. Trình xác thực thực hiện trong Eclipse
- 20. Xác thực HTTP REST - Cách thực hiện?
- 21. Thực thể HTTP chính xác là gì?
- 22. Thực hiện UUID làm khóa chính
- 23. Xác thực chỉ nhập thời gian trong xác thực không chính thức của MV.net asp.net
- 24. GetHashCode (key) & int.MaxValue
- 25. Net GetHashCode Bit Chuyển Operation
- 26. Thực hiện hoàn thành chính xác một khối có thể thử lại
- 27. Làm thế nào để thực hiện và cập nhật chính xác thanh tiến trình trong cocos2d?
- 28. Cách chính xác để thực hiện so sánh cho một lớp cơ sở là gì?
- 29. Thiết lập InvokeArg chính xác khi thực hiện Zend Framework điều khiển trong Zend_Test khai thác
- 30. quyền tập tin mkfifo không được thực hiện một cách chính xác
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