Хорошо известно, что сравнение float by == обычно является ошибкой. В классе 3D-вектора (с поплавковыми компонентами X, Y, Z) i, два вектора считаются равными, если их расстояние считается равным нулю.
public override bool Equals(object obj)
{
if (obj == null) {
return false;
}
if (GetType () != obj.GetType ()) {
return false;
}
float d = DistSq ((Vec) obj);
return IsConsideredZero (d);
}
public float DistSq(Vec p)
{
Vec d = this - p;
return d.LengthSq ();
}
public float LengthSq()
{
return X * X + Y * Y + Z * Z;
}
private const float VEC_COMPARE_EPSILON_ABS = 1E-05f;
public static bool IsConsideredZero(float f)
{
return Math.Abs (f) < VEC_COMPARE_EPSILON_ABS;
}
До сих пор все работало нормально. Однако теперь я хочу получить хэш-код вектора. Я вижу, что что-то вроде hash = (int)X^(int)Y^(int)Z
обязательно терпит неудачу.
Лучшее, что я мог придумать, было:
public override int GetHashCode()
{
return 0;
}
Это, конечно, отстой. Есть ли способ получить разумный хэш-код? NaNs и другие специальные значения возможны, но маловероятны, в случае, если это важно.