The MSDN documentation on Object.GetHashCode() describes 3 contradicting rules for how the method should work.
By default it does it based on the reference to the object, but that means that it's the exact same object, so both would return the same hash. But a hash should be based on the value, like in the case of the string class. "a" and "b" would have a different hash, but "a" and "a" would return the same hash.