> Для чего нужны два экстра бита внутри бакета map Go и как они используются (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Ozon
Стек: Go
> Пример ответа
Два дополнительных бита (так называемые tophash - старшие 8 бит хеша) в каждом бакете (bucket) Go map используются для ускорения поиска и оптимизации сравнения.
Назначение:
-
Быстрый провал (early rejection): При поиске ключа сначала сравнивается
tophashэлемента с вычисленнымtophashискомого ключа. Если они не совпадают - сразу переходим к следующему слоту, не вызывая дорогую функцию сравнения полных ключей (особенно для строк или структур). -
Маркировка состояния слота: Битовая маска
tophashхранит не только хеш, но и специальные флаги:-
emptyRest(0) - слот пуст, и все последующие тоже пусты (конец цепочки). -
emptyOne(1) - слот пуст, но не конец. -
evacuated(2) - слот перемещён при рехешировании. -
minTopHash(4) - минимальное значение для реального хеша (если хеш меньше - он смещается, чтобы не пересекаться с флагами).
-
Использование:
-
При вставке
tophashсначала проверяется наemptyRest, чтобы найти свободное место. -
При поиске цикл по слотам бакета прерывается, как только встречается
emptyRest- это гарантирует, что ключа нет, без просмотра всех 8 слотов. -
При рехешировании
evacuatedпозволяет корректно обрабатывать частично перемещённые бакеты.
Таким образом, два байта tophash на слот (всего 16 байт на бакет из 8 слотов) экономят время сравнения и упрощают логику обхода.
> Похожие задачи по backend
Как сервер и клиент используют proto-файл в gRPC
Что такое len и cap в слайсах Go и как они работают
Что такое rune в Go
Почему в Go нет гарантии порядка выполнения горутин
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью