Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
3 / 3 / 0
Регистрация: 30.08.2021
Сообщений: 29

Зачем нужны хэши

18.01.2024, 10:44. Показов 2339. Ответов 24
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне иногда приходится указывать различные типы данных в других типах данных, которые его не поддерживают то, что я в ней пишу. Пример: set<set<int>>. Для этого приходится писать 2 структуры - hash и equal (set<set<int>, hash, equal>). С equal все понятно - она нужна для того, чтобы c++ понял как сравнивать данный тип, но hash зачем? Что будет если я напишу плохую hash функцию? Допустим она будет выдавать всегда одно значение. И вообще зачем она нужна и где используется?

Заранее спасибо)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2024, 10:44
Ответы с готовыми решениями:

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Зачем нужны операторы << и >>
В книжке Дейтлов есть код http://pic.ipicture.ru/uploads/091222/thumbs/q1TZw4n1JQ.jpg Вопрос в том, что там где написано, что числа...

Зачем нужны исключения?
Добрый вечер, прочитал статью об исключениях, не очень понимаю, почему бы не заменить их просто оператором if? Вот код с исключением: ...

24
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
18.01.2024, 11:14
Лучший ответ Сообщение было отмечено 2010142118 как решение

Решение

Цитата Сообщение от 2010142118 Посмотреть сообщение
И вообще зачем она нужна и где используется?
В алгоритмах поиска.

Цитата Сообщение от 2010142118 Посмотреть сообщение
Допустим она будет выдавать всегда одно значение.
Поиск будет медленный (относительно поиска с правильно организованной хеш-функцией)
Т.е. с хорошей хеш функцией должно искаться по теории за O(1), а если хеш всех элементов одинаков - то будет искаться за O(n)
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,177
18.01.2024, 11:15
Лучший ответ Сообщение было отмечено 2010142118 как решение

Решение

Цитата Сообщение от 2010142118 Посмотреть сообщение
но hash зачем?
Ну так надо почитать литературу по азам хэшированных структур данных. Там все будет описано.

А уж затем приходить в форум с конкретными вопросами по непонятным местам.

Цитата Сообщение от 2010142118 Посмотреть сообщение
Что будет если я напишу плохую hash функцию?
Если хэш-функция корректна, но плоха, хэшированная структура данных будет работать корректно, но неэффективно.

Цитата Сообщение от 2010142118 Посмотреть сообщение
Допустим она будет выдавать всегда одно значение.
Получится экстремальный пример корректной, но неэффективной работы. Фактически структура данных выродится в линейный список с линейным поиском по нему.

Цитата Сообщение от 2010142118 Посмотреть сообщение
И вообще зачем она нужна и где используется?
Почитать литературу по азам хэшированных структур данных. Там все будет описано.
2
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
18.01.2024, 11:17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А уж затем приходить в форум
Зачем злой такой?
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,983
18.01.2024, 12:00
hash нужен для быстрого поиска бакета с коллизиями, а equal - для поиска внутри бакета

Цитата Сообщение от 2010142118 Посмотреть сообщение
set<set<int>>
если речь про std::set, то мимо, он не использует хеш. std::unordered_set - использует
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.01.2024, 12:30
2010142118, хеширование, это способ (не однозначной, в общем случае) нумерации объектов. То есть, это отображение объектов класса, являющихся с точки зрения данных, матрицами, состоящими в свою очередь, из различных объектов на множество целых неотрицательных чисел. Такая операция позволяет хранить данные в массивах и обращаться к ним по индексу где индекс и есть хеш данного элемента. Хеширующая структура сама заботится о правильном размещении используя хеш-функцию, которую предоставляет пользователь. При поиске, эта же функция используется для определения требуемого индекса. Среди проблем нужно отметить две противостоящие задачи: - создание такой функции, которая более равномерно "размазывает" данные по массиву ("hesh" - размазывать), то есть, имеющей высокую разрешающую (различающую) способность и задача создания быстрой функции хеширования. Полная разрешающая способность, соответствует полной однозначности, но применяется редко. Например, задача хеширования строк приводит к компромиссному решению, как и многие другие. Ведь если выбрать для представления номера числа в системе счисления с основанием равным алфавиту, то можно и в множество unsigned long не поместиться, не говоря уже о том, что быстрой хеш-функция не будет. Отсюда и необходимость неоднозначности отображения. В способе основанном на "цепочках", например, элементы с одинаковым хешем формируются в группы (цепочки), а массив содержит указатели на эти цепочки. Чем меньше , в среднем размер цепочки, по массиву, тем лучше. Быстрые хеш-функции дают размер больше. При поиске, индекс даёт адрес группы моментально O(n). Но потом, нужно пройти по группе последовательно, для определения содержится ли тот элемет, что мы ищем, в массиве. Вот тут можно увидеть гибридное решение для структуры использующей сортированный массив адресных выражений на цепочки в сортированном списке содержащем адресные выражения на элементы списка, который не сортирован и хранит сами значения как некая куча. Всего - три уровня доступа, два из которых не прямые, в терминах контейнеров) Это не хеширование и не дерево. Но есть общие черты) Остальное почитайте, если найдется время и желание:
https://www.cyberforum.ru/blog... g4772.html
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
19.01.2024, 12:33
IGPIGP
Вы меня извините, но если бы я не знал что такое хэш - я бы хрен что понял.
Зачем люди так непонятно пишут??

Цитата Сообщение от IGPIGP Посмотреть сообщение
это отображение объектов класса, являющихся с точки зрения данных, матрицами, состоящими в свою очередь, из различных объектов
что это?? зачем это нагромождение текста в этом месте?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
19.01.2024, 13:12
KSergey9, это же IGPIGP. Всё стандартно.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.01.2024, 21:29
KSergey9, я пишу так как считаю нужным. Когда люди ищут информацию о непонятном, они перелопачивают много разных источников, а картина складывается из фрагментов понятного в каждом из них. Хороший текст, как мне кажется, рассчитан как на разных читателей, так и на перспективу для одного. Кто-то поймёт сразу, кто-то позже.
Что касается отображения, то тут все немного математики, как однажды мудро отметил, любимый мною Байт. Если отображение множества X на множество Y (однозначное), не дошло в 6-м классе, туда и нужно возвращаться.
Цитата Сообщение от Croessmah Посмотреть сообщение
это же IGPIGP. Всё стандартно
Croessmah, да. Это я. Но "стандартно", здесь применимо только с вашей точки зрения. А это, действительно, стандартно.
Цитата Сообщение от KSergey9 Посмотреть сообщение
IGPIGP
Вы меня извините, но
Не могу себе позволить такую роскошь. Я написал о хеш-структурах, несколько не так, как о них обычно пишут. И дал ссылку на структуру поиска совмещающую лучшие качества массива и списка. Такой штуковины не было до того. Это о стандартном и не стандартном. Я не хочу стучать копытом в грудь, но когда приходится, - ни чего не поделаешь. О критериях "неочевидность" и "новизна", я знаю, пожалуй поболее чем львиная доля присутствующих. Я изобретатель. Но некоторым недоступно, даже понятие "стандартность". Отсюда и возгласы. Но главное в данном диалоге заключается в критериях "полезность" и "практическая осуществимость". Я думаю, что любой взгляд полезен, если он не скушен или, по крайней мере, свеж. А уж то, осуществится ли понимание у конкретного читателя, зависит от читателя. Мы тут обсуждаем и вопросы, о которых просто не скажешь. А скажешь - упростишь и будут реплики похлеще вашей. Можно конечно послать всех спрашивающих в библиотеку. Но зачем мы тогда тут? Есть раздел C++ с названием без слов: "для новичков", но и там посылать учиться не этично. Если вопрос не соответствует уровню раздела, это дело модераторов.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6118 / 2813 / 1038
Регистрация: 01.06.2021
Сообщений: 10,262
19.01.2024, 22:28
2010142118, за всё время я только раз использовал хеши - при написании движка для крестиков-ноликов, когда реализовал хеш-таблицу. Причем, я не писал свою хеш функцию, а использовал из стандартной библиотеки std::hash<std::vector<bool>>. Свою хеш функцию люди пишут редко, как правило, функций стандартной библиотеки всегда хватает. Да и если написать плохую хеш функцию, то будут коллизии.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,177
20.01.2024, 11:48
Цитата Сообщение от Royal_X Посмотреть сообщение
Причем, я не писал свою хеш функцию, а использовал из стандартной библиотеки std::hash<std::vector<bool>>. Свою хеш функцию люди пишут редко, как правило, функций стандартной библиотеки всегда хватает.
Чисто чтобы придраться: std::hash - не функция, а класс.

(Быстро уходит.)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6118 / 2813 / 1038
Регистрация: 01.06.2021
Сообщений: 10,262
20.01.2024, 12:40
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Чисто чтобы придраться
зачем?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
не функция, а класс
Это если говорить о внутреннем представлении. Но даже в стандарте языка используется выражение hash function как синоним.
Цитата Сообщение от 2010142118 Посмотреть сообщение
Что будет если я напишу плохую hash функцию? Допустим она будет выдавать всегда одно значение.
Будут коллизии. Как уже писал выше, лучше этого не делать, если вы не разбираетесь в алгоритмах вычисления хеша. Вместо этого использовать стандартную библиотеку.
Цитата Сообщение от 2010142118 Посмотреть сообщение
И вообще зачем она нужна и где используется?
Выше уже писал, что я его использовал только один раз при написании движка для крестиков-ноликов (вообще, этот же движок можно переделать для любой другой антагонистической игры с нулевой суммой - шашки, шахматы и т.д., ведь, всего лишь меняется только эвристическая функция и при желании переделываются доп. оптимизации). Использовал там хеши в std::unordered_map, с помощью которого реализовал хеш-таблицу. Таким образом, я сокращал время поиска лучшего хода, т.к. поиск обращался к таблице.

Еще нечто похожее использовал при использовании алгоритма A*, когда писал головоломку "водопроводчик". Но тогда собсна никакая сложная хеш функция не понадобилась. У меня были объекты, которые имели координаты x и y, и нужно было каждой позиции дать уникальный id. Оказалось достаточно Cantor Pairing Function. Псевдокод такой:
C++
1
2
3
4
int id(int x, int y)
{
    return (x + y) * (x + y + 1) / 2 + y;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.01.2024, 13:47
Что бы не придраться.
Цитата Сообщение от Royal_X Посмотреть сообщение
а использовал из стандартной библиотеки std::hash<std::vector<bool>>
Royal_X, а зачем вектор булок? Памяти не хватало?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6118 / 2813 / 1038
Регистрация: 01.06.2021
Сообщений: 10,262
20.01.2024, 14:00
Цитата Сообщение от IGPIGP Посмотреть сообщение
Памяти не хватало?
это же хеш-таблица, она очень быстро заполняется, поэтому старался экономить память. По этой причине состояние доски представлялось в булках. Я еще резервировал память, чтобы сразу выделить память на корзинки (так намного экономнее). Более того, таблица так быстро заполняется, что должен быть лимит. Например, даже UCI - шахматные движки поддерживают выставление лимита, например, setoption name hash value 1024
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,177
20.01.2024, 21:45
Цитата Сообщение от Royal_X Посмотреть сообщение
У меня были объекты, которые имели координаты x и y, и нужно было каждой позиции дать уникальный id. Оказалось достаточно Cantor Pairing Function.
Ценность в Cantor Pairing Function в абстрактной математике заключается в том, что она разработана с учетом того (и именно для того), что диапазон входных значений неограничен. Но в практическом программировании это обычно не так. Если вам нужно сформировать уникальный идентификатор из двух 16-битных значений - им можно просто конкатенировать 16+16 = 32 или, если вам нужна "близость близких", перемешать побитово (т.наз. "числа Мортона" https://graphics.stanford.edu/... bleObvious).

Вариантов много, но суть моего замечания в том, что всякие Cantor Pairing Functions - это следствие работы в тесных рамках того, что разрешается в абстрактной математике. В практическом программировании нам разрешается и дается намного больше и, соответственно, открывается масса более привлекательных вариантов.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.01.2024, 23:24
Цитата Сообщение от Royal_X Посмотреть сообщение
это же хеш-таблица, она очень быстро заполняется, поэтому старался экономить память.
Вектор с логическими переменными медленнее чем vector<unsigned>, потому что булки упакованы в машинное слово и на каждой операции с конкретным байтом распаковываются. То есть, такая фишка может пригодиться лишь если память, - бутылочное горлышко)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6118 / 2813 / 1038
Регистрация: 01.06.2021
Сообщений: 10,262
21.01.2024, 00:47
IGPIGP, я знаю, что вектор булок неидеален. На самом деле, vector<unsigned> тоже не вишенька. Правильнее будет через битовые строки, а для вычисления хеша вместо использования hash из стандартной библиотеки написать собственную функцию, реализовав Zobrist hashing. Именно так реализовано в сильнейшем шахматном движке - Stockfish. Я это к тому, что учить меня не надо, я всё отлично знаю, как делать правильно. Движок я написал за день и разумеется особо не углублялся и не всегда делал так, как правильно, а делал так, как мне было удобно. Собственно, первостепенная задача была создать работающий движок и эта задача была успешна выполнена. А дальше я просто потерял интерес и не стал улучшать движок. Но не думаю, что всё это интересно ТС. Он спрашивал, зачем нужна и где используется хеш-функция, я вот привел один пример из своего небогатого опыта программирования как хобби.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.01.2024, 02:03
Цитата Сообщение от Royal_X Посмотреть сообщение
Я это к тому, что учить меня не надо, я всё отлично знаю,
Я не учил, а просто, задал вопрос. Почему вектор целых, не вишенка, в контексте вопроса, я не понял. Он быстрее чем вектор булиней и именно это я имел ввиду. Моё разъяснение к не тому, что бы вас учить, а к тому зачем я задал вопрос. Хеш функция, в частности, не может обойти необходимость доступа к полям vector<bool>, а ведь мы говорим о скорости этой функции в данной теме. Смысл вопроса был в том, на какой системе вам не хватало памяти. Ну да ладно.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6118 / 2813 / 1038
Регистрация: 01.06.2021
Сообщений: 10,262
21.01.2024, 02:24
Цитата Сообщение от IGPIGP Посмотреть сообщение
Почему вектор целых, не вишенка, в контексте вопроса, я не понял.
Во-первых, в стандартной библиотеке hash поддерживает только вектор булок, но не другие векторы. Если бы я использовал вектор целых, то тогда пришлось бы юзать какую-нибудь другую библиотеку, либо писать свою хеш-функцию, что было бы потерей времени. А вот вектор булок позволил мне за один день создать работающий прототип движка.
Во-вторых, вы предлагаете менять шило на мыло. Выше я уже написал, как это делается в серьезных движках.
1
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,983
21.01.2024, 04:54
Royal_X, для вектора интов я бы взял в качестве хеша первые 2 байта длины + 6 первых байтов содержимого
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.01.2024, 04:54
Помогаю со студенческими работами здесь

Зачем нужны классы?
Изучаю СИ++ после изучения СИ. Не пойму какой смысл в классах. То что они делают можно реализовать с помощью функций, структур и обычных...

Зачем нужны указатели
Не могу понять синтаксис указателей. Понял, что это работа с адресами, что оператор &amp; это адрес. А вот * как я понял, это объявление...

Зачем нужны скобочки?
Объясните пожалуйста зачем надо ставить в коде так много скобок? if(((a+b)*(a-b)))

Зачем нужны указатели?
Интересует вопрос, зачем нужны указатели? Например почему лучше нужно объявлять переменные как указатели, почему как обычно нельзя? ...

Зачем нужны итераторы?
Практическое использование мне понятно - с их помощью обходят контейнеры и т.д и т.п.Но почему не реализовать нужные методы,перегрузить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru