2010-09-07 32 views
6

Tôi đang cố gắng hiểu những gì object.GetHashCode() được sử dụng cho. Tôi đọc rằng nó được sử dụng bởi các bộ sưu tập để nhận dạng duy nhất các khóa. Nhưng tôi muốn thử nghiệm điều này và kết quả không phải là những gì tôi mong đợi.Tại sao GetHashCode() lại quan trọng?

struct Animal 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public Animal(string name, int age) : this() 
    { 
     Name = name; 
     Age = age; 
    } 

    public override int GetHashCode() 
    { 
     return Age.GetHashCode(); 
    } 
} 

object doggy = new Animal("Dog", 25); 
object cat = new Animal("Cat", 25); 

Hashtable table = new Hashtable(); 
table.Add(doggy, "Dog"); 
table.Add(cat, "Cat"); 

Console.WriteLine("{0}", table[cat]); 
Console.WriteLine("{0}", table[doggy]); 

tôi dự kiến ​​sẽ có "Cát" sẽ ghi đè lên "Chó" hoặc một số loại lỗi nói với tôi rằng "chìa khóa đã tồn tại" nhưng sản lượng là

"Cat" "Dog"

+3

btw - nó không liên quan đến câu hỏi, nhưng 'struct' là một lựa chọn rất nghèo cho kịch bản này. Nếu nghi ngờ, hãy sử dụng 'lớp'. Nếu không nghi ngờ, có lẽ vẫn dùng 'class'. Đó là * cực kỳ * hiếm (có hiệu lực) khai báo một 'struct' trong C#. –

+0

Vâng tôi đồng ý, thực sự thử nghiệm ban đầu với lớp, nhưng tôi đã cố gắng thay thế cấu trúc để xem nó có tạo sự khác biệt không :) –

Trả lời

12

GetHashCode chỉ là đầu tiên kiểm tra, dùng để xác định không bình đẳng và thể bình đẳng. Sau đó, Equals được chọn. Mà đối với các đối tượng mặc định để tham khảo bình đẳng, và cho cấu trúc là một so sánh thành viên. Ghi đè Equals để cung cấp triển khai thích hợp (được ghép nối với mã băm) và sẽ cung cấp kết quả bạn mong đợi (khóa trùng lặp).

btw, IDE có lẽ đã tạo cho bạn một cảnh báo rằng GetHashCodeEquals luôn cần được điều trị với nhau ...

+0

Ngoài ra, MSDN khẳng định: "Các lớp có nguồn gốc ghi đè GetHashCode cũng phải ghi đè Bằng để đảm bảo rằng hai các đối tượng được coi là bằng nhau có cùng mã băm; nếu không, loại Hashtable có thể không hoạt động chính xác. " http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx –

2

mã Hash được sử dụng như một tấm séc đầu tiên để phân chia đối tượng thành các nhóm. Nếu một bộ sưu tập chứa mã băm của mỗi mục trong đó, nó có thể tìm kiếm một mục bằng cách tìm kiếm đầu tiên các mục có mã băm khớp với mục của mục được tìm kiếm. Sau khi tìm thấy một hoặc nhiều mục như vậy, nó có thể kiểm tra chúng chi tiết hơn. Lý tưởng nhất, các đối tượng không bằng nhau sẽ luôn trả về các mã băm khác nhau, nhưng điều đó không thực tế. Nếu các đối tượng không trả về mã băm giống hệt nhau, có thể cần phải kiểm tra tất cả chúng một cách chi tiết bất kỳ khi nào một trong số chúng được tìm kiếm.

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