Tôi sẽ tránh làm điều đó đơn giản với lý do nó tạo ra một loạt các chuỗi vô nghĩa - mặc dù điểm của Kosi2801 về việc tạo ra các va chạm đơn giản cũng có liên quan. (Tôi nghi ngờ nó sẽ không thực sự tạo ra nhiều va chạm, do bản chất của các lĩnh vực, nhưng ...)
Tôi sẽ đi cho thuật toán "đơn giản và dễ dàng để có được" tôi trước đây used in this answer (cảm ơn vì đã tìm kiếm nó :) - và được liệt kê trong Java hiệu quả, như bạn đã nói. Trong trường hợp này, nó sẽ kết thúc là:
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;
}
Đó không phải là không an toàn, tất nhiên. Nếu bạn đang sử dụng C# 3 bạn có thể muốn xem xét một phương pháp khuyến nông:
public static int GetNullSafeHashCode<T>(this T value) where T : class
{
return value == null ? 1 : value.GetHashCode();
}
Sau đó, bạn có thể sử dụng:
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;
}
Bạn thể tạo một tiện ích thông số phương pháp mảng để làm điều này thậm chí còn đơn giản hơn :
public static int GetHashCode(params object[] values)
{
int hash = 17;
foreach (object value in values)
{
hash = hash * 23 + value.GetNullSafeHashCode();
}
return hash;
}
và gọi nó với:
public int GetHashCode()
{
return HashHelpers.GetHashCode(StreetAddress, RuralRoute, City,
Province, Country, PostalCode);
}
Trong hầu hết các loại có nguyên thủy liên quan, do đó sẽ thực hiện quyền anh phần nào không cần thiết, nhưng trong trường hợp này bạn chỉ có tham chiếu. Tất nhiên, bạn muốn kết thúc việc tạo một mảng không cần thiết, nhưng bạn biết những gì họ nói về tối ưu hóa sớm ...
Đối với xét của bạn: http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-systemobjectgethashcode – lance