这个 GetHashCode 够好吗?
is this GetHashCode good enough?
我有这个class:
public class RelationInfo
{
public FieldInfo Field;
public int Index;
public override int GetHashCode()
{ return Field.GetHashCode() ^ int.GetHashCode(); }
public override bool Equals(object obj)
{ return Field == ((RelationInfo)obj).Field && Index == ((RelationInfo)obj).Index; }
}
里面的GetHashCode定义好了吗?我读过类似 FNV 的算法,但最后我谈到了简单的 XOR。原因是这两个字段已经分别很好地散列了,并且由于这两个字段是不同类型的,所以不需要担心对称对碰撞(比如 XORing x 和 y 的 2D 点),所以唯一的碰撞情况是这 2 个字段都不同,但在异或后恰好得到相同的代码,这种情况很少见且可以接受。
是的,GetHashCode 没问题。如果你想避免对称性,应用一些简单的算术值之一,比如否定它。但是 GetHashCode 的每个用户无论如何都必须处理冲突,因此可能不需要。
我有这个class:
public class RelationInfo
{
public FieldInfo Field;
public int Index;
public override int GetHashCode()
{ return Field.GetHashCode() ^ int.GetHashCode(); }
public override bool Equals(object obj)
{ return Field == ((RelationInfo)obj).Field && Index == ((RelationInfo)obj).Index; }
}
里面的GetHashCode定义好了吗?我读过类似 FNV 的算法,但最后我谈到了简单的 XOR。原因是这两个字段已经分别很好地散列了,并且由于这两个字段是不同类型的,所以不需要担心对称对碰撞(比如 XORing x 和 y 的 2D 点),所以唯一的碰撞情况是这 2 个字段都不同,但在异或后恰好得到相同的代码,这种情况很少见且可以接受。
是的,GetHashCode 没问题。如果你想避免对称性,应用一些简单的算术值之一,比如否定它。但是 GetHashCode 的每个用户无论如何都必须处理冲突,因此可能不需要。