ich vermeiden würde tun, dass einfach der Begründung, dass es eine Reihe von Strings pointlessly schafft - obwohl Kosi2801 den Punkt zu machen Kollisionen einfach auch relevant ist. (Ich vermute, wäre es nicht tatsächlich viele Kollisionen erzeugen, aufgrund der Art der Felder, aber ...)
Ich würde für die gehen Algorithmus „einfach und leicht richtig zu machen“ habe ich vorher used in this answer (Danke, dass du nach Lance geschaut hast) - und was in Effective Java steht, wie du gesagt hast. In diesem Fall würde es enden als:
public int GetHashCode()
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + StreetAddress.GetHashCode();
hash = hash * 23 + RuralRoute.GetHashCode();
hash = hash * 23 + City.GetHashCode();
hash = hash * 23 + Province.GetHashCode();
hash = hash * 23 + Country.GetHashCode();
hash = hash * 23 + PostalCode.GetHashCode();
return hash;
}
Das ist natürlich nicht null-sicher. Wenn Sie C# 3 verwenden möchten Sie vielleicht eine Erweiterungsmethode berücksichtigen:
public static int GetNullSafeHashCode<T>(this T value) where T : class
{
return value == null ? 1 : value.GetHashCode();
}
Dann können Sie verwenden:
public int GetHashCode()
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + StreetAddress.GetNullSafeHashCode();
hash = hash * 23 + RuralRoute.GetNullSafeHashCode();
hash = hash * 23 + City.GetNullSafeHashCode();
hash = hash * 23 + Province.GetNullSafeHashCode();
hash = hash * 23 + Country.GetNullSafeHashCode();
hash = hash * 23 + PostalCode.GetNullSafeHashCode();
return hash;
}
Sie könnte eine Parameter-Array-Methode Dienstprogramm erstellen, um diese noch einfacher :
public static int GetHashCode(params object[] values)
{
int hash = 17;
foreach (object value in values)
{
hash = hash * 23 + value.GetNullSafeHashCode();
}
return hash;
}
und nennen sie es mit:
public int GetHashCode()
{
return HashHelpers.GetHashCode(StreetAddress, RuralRoute, City,
Province, Country, PostalCode);
}
In den meisten Typen sind Primitive beteiligt, so dass das Boxen etwas unnötigerweise ausgeführt würde, aber in diesem Fall hätten Sie nur Referenzen. Natürlich würden Sie unnötig ein Array am Ende die Schaffung, aber wissen Sie, was sie über vorzeitige Optimierung sagen ...
Für Ihre Überlegung: http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-systemobjectgethashcode – lance