Consider the following code:
struct Vec2 : IEquatable { double X,Y; public bool Equals(Vec2 other) { return X.Equals(other.X
If size of your hash code is lesser than size of your struct, then clashes are inevitable anyways.