2011-05-31 10 views
6

В примере this плакат переопределил метод get hash code. Я понимаю, что это было сделано для того, чтобы обеспечить лучшее значение хэша для возвращаемого объекта, уменьшить количество коллизий и, следовательно, уменьшить количество случаев, необходимо будет позвонить Equals().C# Переопределение метода GetHashCode

Что я хотел бы знать, как этот алгоритм был рассчитан:

return 17 + 31 * CurrentState.GetHashCode() + 31 * Command.GetHashCode(); 

Есть ли конкретная причина того, что числа в вопросе были выбраны? Могу ли я просто подобрать свои собственные номера, чтобы положить в него?

+1

Только для информации компилятор MS C# (для анонных типов) использует семя '-1134271262' и множитель' -1521134295'. Просто sayin ' –

+0

@MarcGravell: У вас есть источник для этого? – DeepSpace101

+0

@ DeepSpace101 ILDASM; p –

ответ

4

Как правило, вы должны выбрать простые. Это поможет вам избежать получения одного и того же значения хэша для разных входных параметров.

2

Простые числа обычно используются в вычислении хэш-кода для минимизации столкновений. Если вы ищете хэш-код и простых чисел на этом ISTE, вы найдете некоторые подробные разъяснения по этому вопросу (обратите внимание, что это примечание конкретного языка):

1

Обычно вы хотите использовать простые числа (как это сделано выше), потому что это уменьшает вероятность столкновений (два экземпляра дают одинаковый результат). Для получения дополнительной информации см.: http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/

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