What is an appropriate `GetHashCode()` algorithm for a 2D point struct (avoiding clashes)

前端 未结 5 2010
长发绾君心
长发绾君心 2020-12-20 11:31

Consider the following code:

struct Vec2 : IEquatable
{
    double X,Y;

    public bool Equals(Vec2 other)
    {
        return X.Equals(other.X         


        
5条回答
  •  感情败类
    2020-12-20 12:19

    Hash collisions don't wreak havoc in a dictionary collection. They'll reduce the efficiency if you're unlucky enough to get them, but dictionaries have to cope with them.

    Collisions should be rare if at all possible, but they're don't mean the implementation is incorrect. XORs are often bad for the reasons you've given (high collisions) - ohadsc has posted a sample I gave before for an alternative, which should be fine.

    Note that it would be impossible to implement Vec2 with no collisions - there are only 232 possible return values from GetHashCode, but there are rather more possible X and Y values, even after you've removed NaN and infinite values...

    Eric Lippert has a recent blog post on GetHashCode which you may find useful.

提交回复
热议问题