Không phải là một câu trả lời trực tiếp câu hỏi của bạn, mà Jonas đã trả lời tốt, tuy nhiên điều này có thể hỗ trợ nếu bạn đang lo lắng về việc thử nghiệm bình đẳng trong băm
Từ bài kiểm tra của chúng tôi, tùy thuộc vào những gì bạn đang cần với hashcodes, trong C#, hashcodes không cần phải là duy nhất cho các hoạt động bình đẳng. Ví dụ, hãy xem xét những điều sau đây:
Chúng tôi đã có yêu cầu quá tải toán tử bằng, và do đó chức năng GetHashCode của đối tượng của chúng tôi đã trở nên dễ bay hơi và không quốc tịch, và tìm nguồn trực tiếp từ dữ liệu, ở một nơi ứng dụng chúng tôi cần để đảm bảo rằng một đối tượng sẽ được xem bằng với một đối tượng khác nếu nó được lấy từ cùng một dữ liệu, không chỉ khi nó là cùng một tham chiếu. Số nhận dạng dữ liệu duy nhất của chúng tôi là Hướng dẫn.
Toán tử bằng được dễ dàng phục vụ vì chúng tôi vừa kiểm tra hướng dẫn của bản ghi (sau khi kiểm tra giá trị rỗng).
Không may kích thước dữ liệu HashCode (là int) phụ thuộc vào hệ điều hành và trên hệ thống 32 bit của chúng tôi, mã băm sẽ là 32 bit. Về mặt toán học, khi chúng ta ghi đè hàm GetHashCode, không thể tạo ra một mã băm duy nhất từ một guid lớn hơn 32 bit (xem nó từ cuộc trò chuyện, làm thế nào bạn dịch một số nguyên 32 bit thành một guid?). Sau đó, chúng tôi đã thực hiện một số thử nghiệm trong đó chúng tôi lấy Guid làm chuỗi và trả về mã Hashcode của Guid, hầu như luôn trả về một mã định danh duy nhất trong các thử nghiệm của chúng tôi, nhưng không phải lúc nào cũng như vậy.Tuy nhiên, những gì chúng tôi đã thông báo, khi một đối tượng nằm trong đối tượng thu thập băm (một hashtable, một từ điển, v.v.), khi 2 đối tượng không phải là duy nhất nhưng hashcodes của chúng là hashcode chỉ được sử dụng như tra cứu tùy chọn đầu tiên, nếu có mã băm không phải là duy nhất đang được sử dụng, thì toán tử bình đẳng sẽ luôn được sử dụng như là một sự sụp đổ để xác nhận sự bình đẳng.
Như tôi đã nói điều này có thể hoặc có thể không liên quan đến tình huống của bạn, nhưng nếu đó là một mẹo hữu ích.
CẬP NHẬT
Để minh hoạ, chúng tôi có một Hashtable:
chính: Object A (Mã lệnh bí mật 1), giá trị Object A1
chính: Object B (Mã lệnh bí mật 1), giá trị Object B1
chính: Object C (Mã lệnh bí mật 1), giá trị Object C1
chính: Object D (Mã lệnh bí mật 2), giá trị Ob JECT D1
chính: Object E (Mã lệnh bí mật 3), giá trị Object E1
Khi tôi gọi là Hashtable cho đối tượng với phím của Object A, đối tượng A1 sẽ được trả lại sau 2 bước, một lời kêu gọi hashcode 1, sau đó kiểm tra bình đẳng trên đối tượng khóa vì không có khóa duy nhất với mã băm 1
Khi tôi gọi hàm bắt đầu cho đối tượng bằng khóa của Object D, đối tượng D1 sẽ được trả về sau 1 bước , một tra cứu băm
Kết luận: Không bao giờ tồn tại hoặc truyền kết quả của 'GetHashCode()'. Chỉ sử dụng nó cho mục đích dự định của nó: để tạo thuận lợi cho việc sử dụng các bảng băm. –