One of the architects on the CLR
team just reminded me of a detail about GetHashCode on object… Specifically you
should NOT use it as a unique
ID for an object. It is possible
for two different objects to return the same value.
By the contract of GetHashCode we
know that if two objects have different hash codes, they are not the same
object. But if two objects have the
same hash code, they are not necessarily the same object (but it’s very likely
that they are).
Today we use the index of the sync
block for the hashcode. This has
some perf issues as we delay create the sync block so it is allocated only when
needed. With V1.0 ands V1.1 this
means calling GetHashCode creates a syncblock. In a future version we will change
GetHashCode to return essentially a random number. The number is of course stable so
that invoking Object.GetHashCode repeatedly on any given object will always
return the same value. But it does
make the contract described above more apparent, so you are well advised to code
with that that in mind today.