Приведи примеры методов разрешения коллизий

«Приведи примеры методов разрешения коллизий» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go коллизии в хэш-таблицах (map) разрешаются автоматически, но если говорить о реализации хэш-таблиц вручную, основные методы:

  1. Метод цепочек
    Каждый бакет содержит связанный список элементов с одинаковым хэшем:
    type Node struct {
        key   string
        value int
        next  *Node
    }
    type HashTable struct {
        buckets []*Node
    }
  1. Открытая адресация
    При коллизии ищется следующий свободный бакет (линейное/квадратичное пробирование):
    func (h *HashTable) insert(key string, value int) {
        index := hash(key) % len(h.buckets)
        for h.buckets[index] != nil {
            index = (index + 1) % len(h.buckets) // линейное пробирование
        }
        h.buckets[index] = &Entry{key, value}
    }
  1. Двойное хэширование
    Используется вторая хэш-функция для вычисления шага пробирования.

В стандартной map Go используется комбинация методов (обычно цепочки + открытая адресация).