2008-09-19 4 views
124

Как и многие из вас, я использую ReSharper для ускорения процесса разработки. При использовании его для переопределения членов равенства в классе, код поколение он производит для GetHashCode() выглядит следующим образом:Почему «397» используется для переопределения GetHashCode ReSharper?

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; 
     } 
    } 

Конечно у меня есть некоторые из моих собственных членов там, но то, что я хотел знать почему 397?

  • EDIT: Итак, мой вопрос будет лучше сформулирован как, есть ли что-то особенное о простом числе 397, за исключением того, что это простое число?

ответ

134

Вероятно, потому что 397 является достаточным размером, чтобы вызвать переполнение переменной результата и немного смешать биты хэша, обеспечивая лучшее распределение хеш-кодов. Нет ничего особенного в 397, который отличает его от других простых чисел одинаковой величины.

15

Ben правильный, отражающий сборку, вы можете видеть, что это просто простое число, которое они выбрали для использования.

+8

Какая сборка? – 2011-12-13 21:42:03

+9

asm: `JetBrains.ReSharper.Feature.Services.CSharp` метод:` CSharpEqualityHelper.GenerateGetHashCodeBody` – 2012-12-16 02:43:30

6

Хэш, который использует resharper, выглядит как вариант хеша FNV. FNV часто реализуется с разными штрихами. Обсуждается целесообразный выбор простых чисел для FNV here.

 Смежные вопросы

  • Нет связанных вопросов^_^