Как часто на практике используется Hash? (C# Backend)

Подскажите, пожалуйста, как часто используются hash\хэширующие функции в разработке и в каких ситуациях вам пришлось с этим работать?
Дело в том, что в своём курсе сильно застопорился на хэшах, никак не могу добить эту тему. Хотел бы пойти дальше и вернуться позже, после уменьшения потока информации или при конкретной задаче, но опасаюсь, что это важная тема.


Ответы (3 шт):

Автор решения: CrazyElf

Если вы планируете использовать ваши объекты, например, в качестве ключей словаря, то качественная хэш-функция просто must have, иначе у вас будет много коллизий и ваш словарь вместо O(1) будет показывать гораздо более худшую производительность.

Ну и если вы кладёте объекты в HashSet, например.

→ Ссылка
Автор решения: VladD

Я предполагаю, что вы имеете в виду функцию GetHashCode, которая есть у каждого объекта в .NET.


Непосредственно данная функция используется довольно редко. Однако, она используется часто косвенно, когда ваш объект попадает в качестве ключа в Dictionary, HashSet, или группируется в LINQ (GroupBy или там Distinct).

Для начала, вам про хэш достаточно знать следующее:

  • Одинаковые объекты должны иметь одинаковые хеши
    • Но не наоборот! Если хэши одинаковые, то объекты не обязаны быть одинаковыми
  • Функция GetHashCode, если уж и вызывается, то много раз подряд, поэтому она должна быть быстрой
  • Хэшкод объекта не должен (!) меняться, если/пока объект служит ключом в HashSet/Dictionary.
    • Поэтому не стоит использовать мутирующие объекты в качестве ключей. Или стоит, но нужно хорошо понимать, что вы делаете.
  • Обычно для вычисления хэшкода объекта используют комбинацию из хэшкодов полей, это выглядит как HashCode.Combine(f1, f2, f3, ...)
    • Сумма или там XOR хэш-кодов полей хуже по многим причинам
    • Если содержимое поля не является логической частью объекта, не включайте его в вычисление хэшкода. Например, если вы держите в поле ссылку на какой-нибудь внешний объект, который может поменять хэш-код сам по себе.

Более глубокие знания по идее можно «добить» и попозже.

→ Ссылка
Автор решения: Alexander Petrov

Очень часто, а вернее, практически всегда, используется хеширование паролей. Как только вам понадобится хранить информацию о пользователях, сразу возникнет вопрос: как это сделать надёжно? Тут-то хеши и понадобятся.

→ Ссылка