Два основных метода. Chaining (цепочки) — каждый бакет хранит список элементов с одинаковым хешем. Open addressing — при коллизии ищешь следующую свободную ячейку (linear probing, quadratic probing, double hashing).
Go map использует chaining: каждый бакет хранит 8 пар + overflow-указатель. Chaining проще, но больше аллокаций. Open addressing лучше по cache locality, но сложнее удаление.
Robin Hood hashing — вариант open addressing с выравниванием расстояний, используется в Rust hashmap.