Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 86

Хеш, хеш-функция, хеширование и HashMap

15.01.2020, 19:54. Показов 6682. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Снова приветствую, я начал свое знакомство с классом HashMap в Java и ввиду расхождений в разных источниках, которые запутали меня, возник вопрос насчет хеширования и поиска нужного индекса в хеш-таблице. Я читал статью на хабре, но она применима только к Java 7, а с тех пор класс очень сильно изменился.

Хеш-функция и хеш-код это вроде бы разные понятия, но почему-то в некоторых статьях я не раз видел, что их смешивают и приравнивают, что вводит меня в дополнительную путаницу. Да и большинство статей с подробным разбором довольно старые. Например, в Java 7 индекс нужной ячейки вычислялся в методе indexFor, сейчас же его нет (использую JDK 12). Прошу помощи, чтобы я смог разобраться и не плутал вокруг этого уже третий день.

Я попробовал посмотреть в документации и попробовал что-то найти. Внутри массива в ячейках лежат узлы класса Node. В этом классе есть поле hash - это и есть тот самый хеш-код, полученный в результате хеширования?

Также там есть метод hashCode(), который вычисляется так:

Java
1
return Objects.hashCode(key) ^ Objects.hashCode(value);
Но я думал, что хеш-код вычисляется только по ключу? Именно результат этого метода будет лежать в поле hash класса Node? И при переопределении метода hashCode() мы переопределяем именно этот метод?

Но дальше по классу я нахожу следующий метод: static final int hash(Object key), который уже вычисляется как:

Java
1
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
Описание этого метода в документации мне почти ничего не дало - есть упоминание, что вычисляет хеш-код для ключа и какие-то сдвигами с XOR'ами. Так где вычисляется хеш-код? И где в таком случае хеш-функция, которая распределяет объекты по нужным ячейкам?

При добавлении объекта в HashMap, вычисляется хеш (хеш-код) ключа, который мы получаем в результате работы метода hashCode(), а далее хеш-функция, используя этот хеш-код в результате своей работы "получает" индексы нужных ячеек массива для вставки? Я конкретно запутался и не могу двинуться дальше.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.01.2020, 19:54
Ответы с готовыми решениями:

HashMap не так задается хеш-код
У меня задание сделать коллекцию из ключа и значения, которое является классом, при записывании оно постоянно перезаписывает предыдущее...

Хеш-функция, двойное хеширование
Всем привет! Пишу курсач, нужна хеш-функция, которая принимала бы строку и возвращала некий индекс. Написал нечто вроде unsigned...

Хеш-функция и хеш-таблица
Всем привет, написал хеш-функцию для строки: #include <iostream> //Главная библиотека #include <string> //Библиотека для...

8
 Аватар для Aviz__
2738 / 2047 / 507
Регистрация: 17.02.2014
Сообщений: 9,465
15.01.2020, 20:25
hsad, https://www.youtube.com/user/K... /playlists - очень доступно объясняет, как в детсаду))
0
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 86
15.01.2020, 21:23  [ТС]
Aviz__ , это конечно хорошо, но если давать ссылку, то на конкретный материал на канале, а не сам канал, на котором 500+ видео. Нашел видео про Collections (причем судя по дате Java 8 там не пахнет, а реализацию в 7 я уже видел и знаю), а он два часа рассказывает про большое O и сортировку слиянием и быструю сортировку - как раз то, что нужно (нет).

Если вы знаете ответы на мои вопросы, я был бы благодарен услышать на них ответы. Я всего лишь хочу понимать эти вещи, не более того, так как код класса ввел меня в ступор. Да и после его прочтения уже начал путать, что такое хеш, что такое хеш-функция и что они делают.
0
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
15.01.2020, 21:31
Тогда вот так
https://habr.com/ru/post/128017/
0
Фрилансер
 Аватар для Black Fregat
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
15.01.2020, 22:09
Вы сами себя запутываете, неизвестно зачем..

Хэш-функция - это любая функция, вычисляющая хэш, то есть некоторое значение заданной разрядности, однозначно вычисляемое по содержимому объекта.
hashCode() - это метод объекта Java, реализующий некоторую конкретную хэш-функцию, выбранную разработчиком класса для правильной идентификации объектов класса.

Как именно по hashCode() вычисляются индексы - зачем Вам это нужно на данном этапе? Главное, что нужно знать - что объекты с разным hashCode() будут храниться более эффективно
0
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 86
15.01.2020, 23:39  [ТС]
vcrop , там Java 7, а в Java 8 HashMap сильно поменялась.
Black Fregat снова вернусь к Java 7, и там был отдельный метод для вычисления нужного индекса - indexFor, который принимал хеш-код и длину внутреннего массива в качестве параметров и далее по формуле определял. А вот в Java 8 и выше его нет, поэтому я задался вопросом, как определяется этот индекс в Java 8+? Неужели прямо в этой хеш-функции?

Зачем мне нужно знать? Потому что я таким же образом разобрал ArrayList и LinkedList и перешел к мапе, но тут сложнее. Максимализм это, наверное.
0
Фрилансер
 Аватар для Black Fregat
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
16.01.2020, 16:23
Цитата Сообщение от hsad Посмотреть сообщение
indexFor, который принимал хеш-код и длину внутреннего массива
Бегло посмотрел - там на деревьях реализация, массива нет, индекса нет
Может, попробуете не ходить "под капот"? Для работы обычно вполне достаточно внешних спецификаций
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
16.01.2020, 16:30
Цитата Сообщение от Black Fregat Посмотреть сообщение
Бегло посмотрел - там на деревьях реализация, массива нет, индекса нет
а еще там огромный комментарий в начале класса написан
0
1 / 1 / 0
Регистрация: 15.10.2019
Сообщений: 13
17.01.2020, 13:04
Бегло посмотрел - там на деревьях реализация, массива нет, индекса нет
Может, попробуете не ходить "под капот"? Для работы обычно вполне достаточно внешних спецификаций
Как это массива нет? Хеш-таблица это и есть массив, который в каждой ячейке хранит связный список до тех пор, пока количество элементов в одном связном списке меньше 8 (при условии, что бакетов не меньше 64). Если их стало 8 или больше, тогда происходит переход от связного списка к красно-черному дереву (из Node в TreeNode).

Так вычисляется индекс нужной ячейки(бакета): i = (n - 1) & hash.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2020, 13:04
Помогаю со студенческими работами здесь

Для формирования хеш-адреса использовать хеш-функцию универсального хеширования
Для формирования хеш-адреса использовать хеш-функцию универсального хеширования . Подскажите пожалуйста код или что надо сделать...

Вычисляет ли словарь хеш, если ключ - числовое значение или в таком случае за хеш берется сам ключ?
Нужен Dictionary<int,Dictionary<int,string>> (т.к. максимальное значение ключа не более 40 можно заменить на...

Хеш функция на си
Нужно написать хэш-функцию. На вход функции подается строка, на выходе сумма кодов символов

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

Хеш функция
Здравствуйте. Помогите с задачей. Таблица строиться по методу цепочек с использованием хэш-функции, возращающий код первой буквы...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru