Всем привет как в заголовке и написал меня интересует узнать что такое HashCode Обсудив это с Более Опытными Людми чем Я Кто может обьясните более простыми словами в Ютубе и Гугле Я только нашел обьяснение с тем что ХашКод связан с ХашСетом Коллекциями но в этом Я не сооброжаю так что Решаюсь спросить здесь
MR. Leo
15 уровень
HashCode Как он работает и что это вообще такое и как с ним быть
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
15 марта, 13:07
Хэшкод это представление джава объекта в числовом виде.
Например, есть объект:
Маша, 10 лет, ученик
Петя, 20 лет, студент
Николай, 25 лет, музыкант
Арина, 80 лет, учительница
что такое объект в джаве, вот к примеру:
то есть объект имеет тип, например Human и имеет целый ряд аттрибутов, которых к слову может быть 10, 100 или даже 1000, различных полей с данными.
Если грубо утрировать, то хэшкод используют для того чтобы очень быстро сравнить объекты.
Представь, что у нас в классе Person 1000 полей.
И ты по ряду причин хочешь сделать коллекцию уникальных людей, как это реализовать?
Для проверки уникальности как и идентичности можно использовать метод equals() который будет проверять
каждый аттрибут то есть, для сравнения двух Person оно выполнит 1000 проверок по каждому полю person1.getName().equals(person2.getName() &&
person1.getProfession().equals(person2.getProfession()) &&
...+998 проверок.
1000 проверок для того чтобы сравнить два объекта, а теперь представь что у нас в коллекции 1000 людей, то при добавлении в коллекцию нового человека, нам нужно выполнить 1000 проверок * 1000 раз, это миллион проверок. А если 100 000 и тд..
Поэтому придумали такую штуку как хэшкод, числовое представление объекта.
Есть метод int hashcode() который реализует хэш-функцию, специальный алгоритм задача которого вычислить такое число, которое максимально насколько возможно не повторялось бы для разных объектов, но для одного и того же объекта давало бы одно и то же число.
Давай попробуем написать свой примитивный алгоритм для примера.
Мы берем количество букв в имени + возраст + количество букв в профессии
Маша - 4 буквы
10 лет
ученик - 6 букв
4 + 10 +6 = 20
0
Justinian Judge в Mega City One Master
15 марта, 13:07
в коде это будет:
И у нас получается:
Маша, 10 лет, ученик - хэшкод 20
Петя, 20 лет, студент - хэшкод 31
Николай, 25 лет, музыкант - хэшкод 40
Арина, 80 лет, учительница - хэшкод 96
Что нам это дает? А то, что при добавлении человека в коллекцию с 1000 элементами, у нас будет не миллион проверок, а максимум тысяча, поскольку СНАЧАЛА проверяется хэшкод:
мы сравниваем Машу с Петей, и прежде чем дошли до проверок полей, мы просто сравниваем хэшкоды:
20 != 31, они разные.
Это значит что сравнивать 1000 полей нету никакого смысла, поскольку числовое отображение объекта разное, а значит и объекты точно разные.
Таким образом это дает очень сильное убыстрение, ведь мы не все 1000 полей сравниваем, а просто 2 числа, это быстро.
При этом, если хэшкод одинаковый то это НЕ значит что объекты одинаковые, а вдруг:
Маша, 10 лет, ученик - хэшкод 20
Ким, 7 лет, бармен - хэшкод 20 3 + 7 + 6
Поэтому при одинаковом хэшкоде, дальше запустится проверка по полям, а она сразу покажет что
Маша != Ким
10 != 7
и тд
Это грубо я так обрисовал, настоящая хэш функция она будет математически намного сложнее, ведь стоит задача чтобы обеспечить максимальный разброс значений (не было повторений, как в примере с Кимов и Машей, полностью недопустить это нельзя, но что можно сделать делается, но для общего понимания, используя хэшкод и то, что сложный объект можно свести до одного целочисленного числа, есть возможность использовать хэш коллекции, устройство которых построено на использовании хэш кодов и хэш функции, идет распределение по диапазонам и работает еще быстрее.
На данном этапе пока воспринимай как есть , решай задачи и иди дальше по теории, а потом оно все сложится +1
Денис Java Developer
13 марта, 15:59
Ну если совсем коротко, то хеш это отпечаток твоего объекта. Его можно достаточно легко посчитать, а требование контракта equals-hashcode говорит о том что у двух equals объектов и хешкод должен быть одинаковым. А раз посчитать хеш проще чем проводить полное детальное сравнение, то это можно использовать в коллекциях, например HashSet, HashMap. Объекты там хранятся по хешу, по нему же и ищутся. Потом проводится сравнение через equals, делается это потому, что есть не нулевая вероятность того, что два разных объекта будут иметь одинаковый хеш. Именно по этому кстати важно переопределять hashCode корректно, иначе классная производительность Hash связанных коллекций будет нулевой.
0
UK [I'll be good] unemployed
13 марта, 14:48
Сам учусь еще, поэтому просто расскажу как сам понимаю, может помогу)
HashCode или hash-значение это результат вычислений хэш-функции, определенное число(идентификатор), для какого то объекта, который можно использовать для сравнения
или поиска.
Насчет того почему в названии HashSet существует приставка Hash,
потому что HashSet, как и HashMap, используют метод hashcode() для определения позиции
объекта в себе(структуре данных).
Еще вариант почему есть приставка Hash у Set и Map,
потому что HashSet использует под капотом HashMap где HashMap это Hash-таблица,
а в Hash-таблице связь между значением и его позицией, в этой таблице,
задает хэш-функция, где hash-функция получает ключ(данные),
и выдает число - хэш значение, или "hashcode".
0