Generating Hash Code
All object instances can
provide a signed
32-bit integer hash of their contents via the GetHashCode( )
method
on System.Object
. Good
hashes can have a dramatic effect on Hashtable
speed (they are used to determine which bucket to add entries to in
the hashtable), and can also provide a low-fidelity (but possibly
more efficient) equivalence test. Using
GetHashCode
in this way is demonstrated in the
following examples:
void Enroll(Student s, CourseList cl) { hashtable.Add(s, cl); // GHC called on key (s) } bool FastCompare(Student s1, Student s2) { // Use GHC to test for possible equivalence if (s1.GetHashCode( ) != s2.GetHashCode( )) return false; // Use Equals to test for definite equivalence return s1.Equals(s2); }
The default implementation of GetHashCode( )
on
System.Object
returns a semi-unique member #,
while the implementation of GetHashCode( )
on
System.ValueType
merely returns the hash of the
first field in the value type. Although these defaults work in a lot
of cases, there are sometimes performance benefits gained from
implementing GetHashCode( )
on your own type.
Additionally, if a type overrides the Equals( )
method, it is required to override the GetHashCode( )
method, which means that many framework types override
GetHashCode( )
, as shown here:
void DumpHashes(object o, int i, Version v) { Console.WriteLine(o.GetHashCode( )); // object index Console.WriteLine(i.GetHashCode( )); // integer value Console.WriteLine(v.GetHashCode( )); // hash of fields ...
Get C# in a Nutshell, Second Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.