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"
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...
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With