Evitaría hacer eso simplemente con el argumento de que crea un montón de cadenas sin sentido, aunque el punto de Kosi2801 acerca de hacer las colisiones simples también es relevante. (Sospecho que no lo sería en realidad crear muchas colisiones, debido a la naturaleza de los campos, pero ...)
Yo iría por el "simple y fácil de hacerlo bien" algoritmo he previamente used in this answer (gracias por buscarlo lanza :) - y que se enumera en Java efectivo, como dijiste. En este caso, terminaría como:
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;
}
Eso no es nulo seguro, por supuesto. Si estás usando C# 3 es posible que desee considerar un método de extensión:
public static int GetNullSafeHashCode<T>(this T value) where T : class
{
return value == null ? 1 : value.GetHashCode();
}
continuación, puede utilizar:
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;
}
Usted podría crear una utilidad parámetro del método de matriz para hacer esto aún más sencillo :
public static int GetHashCode(params object[] values)
{
int hash = 17;
foreach (object value in values)
{
hash = hash * 23 + value.GetNullSafeHashCode();
}
return hash;
}
y llamarlo con:
public int GetHashCode()
{
return HashHelpers.GetHashCode(StreetAddress, RuralRoute, City,
Province, Country, PostalCode);
}
En la mayoría de los tipos hay primitivas involucradas, por lo que realizaría el boxeo de forma innecesaria, pero en este caso solo tendría referencias. Por supuesto, que terminarías creación de una matriz de forma innecesaria, pero ya sabes lo que dicen acerca de la optimización prematura ...
Para su consideración: no http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-systemobjectgethashcode – lance