Как устроена map в Go
Вопрос
Расскажите, как устроена мапа в Go: хеширование, коллизии, рост, почему порядок обхода случайный, что поменялось в Go 1.24.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Хеш-функция с сидом на каждую мапу (защита от hash flooding), используется AES-хеш при поддержке процессора
До 1.24: массив бакетов по 8 пар, tophash, цепочки overflow, рост вдвое при загрузке 6.5 с инкрементальной эвакуацией
С 1.24: Swiss tables, группы по 8 слотов с контрольным словом, большие мапы делятся на таблицы
Обход начинается со случайной позиции, чтобы на порядок не полагались
Значения неадресуемы, мапа не потокобезопасна, нулевое значение nil
Мапа не уменьшается после удаления ключей: для освобождения памяти её пересоздают
Что могут спросить следом
- Что сделать, если мапа выросла до миллиона ключей, а потом почти всё удалили?
- Чем sync.Map отличается от мапы с мьютексом?
Разбор
Мапа это указатель на структуру рантайма. Ключ хешируется функцией, специфичной для типа, с сидом, который выбирается для каждой мапы, чтобы злоумышленник не подобрал коллизии. До Go 1.24 таблица состояла из массива бакетов по 8 пар; в бакете хранились старшие байты хешей (tophash) для быстрого отсева, при переполнении цеплялся overflow-бакет. Когда в среднем становилось больше 6.5 элемента на бакет, массив удваивался, а перенос шёл постепенно при записях, без большой паузы. В 1.24 реализацию заменили на Swiss tables: группы из 8 слотов с контрольным словом, где на слот хранится 7 бит хеша, что ускоряет поиск и уменьшает память; большие мапы разбиты на несколько таблиц, растущих независимо. Снаружи всё по-прежнему: обход начинается со случайного места, значения нельзя адресовать, конкурентная запись запрещена и может убить процесс. И мапа не уменьшается после delete: если она раздулась и опустела, её пересоздают.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Слайсы и мапы изнутри»
- Разбить слайс на части по k на Go
- Удаление дубликатов с сохранением порядка на Go
- Группировка анаграмм на Go
- Циклический сдвиг слайса на Go
- Число подмассивов с суммой k на Go
- Топ-k частых слов на Go
- Что выведет Go: append при полной ёмкости
- Что выведет Go: два append в один подслайс