views:

1310

answers:

4

Like many of you, I use ReSharper to speed up the development process. When you use it to override the equality members of a class, the code-gen it produces for GetHashCode() looks like:

    public override int GetHashCode()
    {
        unchecked
        {
            int result = (Key != null ? Key.GetHashCode() : 0);
            result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
            result = (result * 397) ^ ObjectId;
            return result;
        }
    }

Of course I have some of my own members in there, but what I am wanting to know is why 397?

  • EDIT: So my question would be better worded as, is there something 'special' about the 397 prime number outside of it being a prime number?
+1  A: 

Because it's a random prime number.

Ben Hoffstein
+9  A: 
Chris Marasti-Georg
4 is not a prime number, so is a bad number to use for GetHashCode
Jon Limjap
Funny and point taken :-)
Ben Hoffstein
I just can't pass up a chance to reference XKCD...
Chris Marasti-Georg
this again :)))
mlvljr
+2  A: 

Ben is correct, reflecting the Assembly you can see it's just a prime number they've chosen to use.

Nick Craver
+15  A: 

Probably because 397 is a prime of sufficient size to cause the result variable to overflow and mix the bits of the hash somewhat, providing a better distribution of hash codes. There's nothing particularly special about 397 that distinguishes it from other primes of the same magnitude.

Nick Johnson