Ответ
В Go коллизии в хэш-таблицах (map) разрешаются автоматически, но если говорить о реализации хэш-таблиц вручную, основные методы:
- Метод цепочек
Каждый бакет содержит связанный список элементов с одинаковым хэшем:
type Node struct {
key string
value int
next *Node
}
type HashTable struct {
buckets []*Node
}
- Открытая адресация
При коллизии ищется следующий свободный бакет (линейное/квадратичное пробирование):
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}
}
- Двойное хэширование
Используется вторая хэш-функция для вычисления шага пробирования.
В стандартной map Go используется комбинация методов (обычно цепочки + открытая адресация).