Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why GetHashCode() matters?

Tags:

c#

.net

I am trying to understand what the object.GetHashCode() is used for. I read that it is used by collections to uniquely identify keys. But I wanted to test this and the result isn't what I expected.

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]);

I would have expected "Cat" would overwrite "Dog" or some kind of error telling me that the "key already exists" but the output is

"Cat" "Dog"

like image 702
Mads Lee Jensen Avatar asked Sep 07 '10 19:09

Mads Lee Jensen


2 Answers

GetHashCode is only the first check, used to determine non-equality and possible equality. After that, Equals is checked. Which for objects defaults to reference-equality, and for structs is a memberwise compare. Override Equals to give an appropriate implementation (paired with the hash-code), and it should give the results you expect (duplicate key).

btw, the IDE is probably already giving you a warning that GetHashCode and Equals should always be treated together...

like image 154
Marc Gravell Avatar answered Sep 26 '22 22:09

Marc Gravell


Hash codes are used as a first check to divide objects into groups. If a collection holds the hash code of each item therein, it can search for an item by first searching for items whose hash code matches that of the item sought. Once it finds one or more such items, it can examine them in more detail. Ideally, objects which are not equal would always return different hash codes, but that's not practical. If objects which are not equal return identical hash codes, it may be necessary to examine all of them in detail any time one of them is sought.

like image 44
supercat Avatar answered Sep 25 '22 22:09

supercat