Как часто на практике используется Hash? (C# Backend)
Подскажите, пожалуйста, как часто используются hash\хэширующие функции в разработке и в каких ситуациях вам пришлось с этим работать?
Дело в том, что в своём курсе сильно застопорился на хэшах, никак не могу добить эту тему. Хотел бы пойти дальше и вернуться позже, после уменьшения потока информации или при конкретной задаче, но опасаюсь, что это важная тема.
Ответы (3 шт):
Если вы планируете использовать ваши объекты, например, в качестве ключей словаря, то качественная хэш-функция просто must have, иначе у вас будет много коллизий и ваш словарь вместо O(1) будет показывать гораздо более худшую производительность.
Ну и если вы кладёте объекты в HashSet, например.
Я предполагаю, что вы имеете в виду функцию GetHashCode, которая есть у каждого объекта в .NET.
Непосредственно данная функция используется довольно редко. Однако, она используется часто косвенно, когда ваш объект попадает в качестве ключа в Dictionary, HashSet, или группируется в LINQ (GroupBy или там Distinct).
Для начала, вам про хэш достаточно знать следующее:
- Одинаковые объекты должны иметь одинаковые хеши
- Но не наоборот! Если хэши одинаковые, то объекты не обязаны быть одинаковыми
- Функция
GetHashCode, если уж и вызывается, то много раз подряд, поэтому она должна быть быстрой - Хэшкод объекта не должен (!) меняться, если/пока объект служит ключом в
HashSet/Dictionary.- Поэтому не стоит использовать мутирующие объекты в качестве ключей. Или стоит, но нужно хорошо понимать, что вы делаете.
- Обычно для вычисления хэшкода объекта используют комбинацию из хэшкодов полей, это выглядит как
HashCode.Combine(f1, f2, f3, ...)- Сумма или там XOR хэш-кодов полей хуже по многим причинам
- Если содержимое поля не является логической частью объекта, не включайте его в вычисление хэшкода. Например, если вы держите в поле ссылку на какой-нибудь внешний объект, который может поменять хэш-код сам по себе.
Более глубокие знания по идее можно «добить» и попозже.
Очень часто, а вернее, практически всегда, используется хеширование паролей. Как только вам понадобится хранить информацию о пользователях, сразу возникнет вопрос: как это сделать надёжно? Тут-то хеши и понадобятся.