Η GetHashCode δεν χρειάζεται να επιστρέφει κάποιο πραγματικά μοναδικό αριθμό. Κατά κανόνα χρησιμοποιείται για ένα γρήγορο έλεγχο πριν κληθεί η ίδια η Equals. Αρκεί λοιπόν να βεβαιωθείς ότι το ίδιο αντικείμενο θα επιστρέφει πάντα το ίδιο hashcode και ότι θα υπάρχει αρκετή διαφοροποίηση από το ένα αντικείμενο στο επόμενο. Από την άλλη, ο υπολογισμός του HashCode θα πρέπει να είναι γρήγορος, αλλιώς χάνεται το νόημα του "γρήγορου ελέγχου".
Η μεγάλη διαφοροποίηση χρειάζεται σε containers όπως το Dictionary ή το HashSet οι οποίοι χρησιμοποιούν το HashCode εσωτερικά για γρήγορα Lookups.
Κατά κανόνα ένα απλό XOR μεταξύ των hashcode των πεδίων του αντικειμένου αρκεί για να υπολογίσεις το hashcode του ίδιου του αντικειμένου. Θα πρέπει να προσέξεις όμως ότι το Dictionary δεν έχει δικό του GetHashCode και χρησιμοποιεί την Object.GetHashCode. Αν θέλεις να ληφθούν υπόψη τα hashcode των περιεχομένων του Dictionary θα πρέπει με κώδικα να υπολογίσεις το XOR των τιμών. Για παράδειγμα:
var hashCode = field1.GetHashCode();
hashCode ^= field2.GetHashCode();
foreach (var pair in dict)
{
hashCode ^= pair.Key.GetHashCode();
hashCode ^= pair.Value.GetHashCode();
}
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos