0

I want to overwrite a GetHashCode method with following code:

public override int GetHashCode()
{
    var magicNumber1 = 5;
    var magicNumber2 = 3;

    return intType * magicNumber1 + 
          (int)enumType * magicNumber2;
}

Is this a proper way of returning GetHashCode when one value is Integer and second an Enum?

Dmitry Bychenko
  • 180,369
  • 20
  • 160
  • 215
helpME1986
  • 933
  • 3
  • 12
  • 26

1 Answers1

1

Well, you current implementation is quite OK, but you can be better off if intType and enumType are of small range. Suppose, intType (allmost always) is in the [0..1000000] and enumType is in the [0..10] range then

   public override int GetHashCode() {
      return unchecked(intType * 10 + (int)enumType);
   }

will be a better choice: many hash collisions that a present in your current code are not such in the code above. For instance

   intType | enumType | old hash | suggested
   -----------------------------------------
         0          5         15           5
         3          0         15          30  

Edit: In your case (please, see comments)

it should not be more than 100

assuming that you don't have negative values, you can try

   public override int GetHashCode() {
     // * 128 == << 7 may be faster than * 100 at some systems 
     return unchecked(intType * 128 + (int)enumType);
   }

and expect to have no collisions at all

Dmitry Bychenko
  • 180,369
  • 20
  • 160
  • 215