Ответ вслух Senior Слайсы и мапы изнутри обновлено

Как устроена 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 ошибок.