// Хеш-таблицы: рандомизация, коллизии и порядок
// Запуск: go run hash_demo.go

package main

import (
	"fmt"
	"hash/maphash"
)

func main() {
	fmt.Println("=== Go: хеш-таблицы ===")
	fmt.Println()

	// 1. map не сохраняет порядок вставки
	fmt.Println("--- 1. Порядок обхода ---")
	m := make(map[string]int)
	for i := 0; i < 10; i++ {
		m[fmt.Sprintf("key_%d", i)] = i
	}
	fmt.Print("Порядок вставки: 0..9\nПорядок обхода:  ")
	for k := range m {
		fmt.Print(k, " ")
	}
	fmt.Println("\n(Go НАМЕРЕННО рандомизирует порядок обхода)")
	fmt.Println()

	// 2. Рандомизация: каждый range — разный порядок
	fmt.Println("--- 2. Рандомизация ---")
	fmt.Print("Первый range:  ")
	for k := range m {
		fmt.Print(k, " ")
	}
	fmt.Println()
	fmt.Print("Второй range:  ")
	for k := range m {
		fmt.Print(k, " ")
	}
	fmt.Println()
	fmt.Println("Go рандомизирует стартовый бакет при каждом range.")
	fmt.Println("Это намеренно: чтобы программисты не зависели от порядка.")
	fmt.Println()

	// 3. Хеш-функция
	fmt.Println("--- 3. hash/maphash ---")
	var h1, h2 maphash.Hash
	h1.WriteString("hello")
	h2.WriteString("hello")
	fmt.Printf("hash1(\"hello\") = %#018x\n", h1.Sum64())
	fmt.Printf("hash2(\"hello\") = %#018x\n", h2.Sum64())
	fmt.Println("Разные хеши! Каждый maphash.Hash имеет свой seed.")
	fmt.Println()

	// 4. Swiss Table в Go
	fmt.Println("--- 4. Внутренняя реализация ---")
	fmt.Println("Go 1.24+ использует Swiss Table (как Rust hashbrown).")
	fmt.Println("До этого — bucket-based с цепочками по 8 элементов.")
	fmt.Println("Swiss Table: SIMD-пробирование, метаданные-байты,")
	fmt.Println("высокий load factor, лучшая cache locality.")
	fmt.Println()

	// 5. Рост карты
	fmt.Println("--- 5. Рост ---")
	big := make(map[int]int)
	for i := 0; i < 1000; i++ {
		big[i] = i
	}
	fmt.Printf("После 1000 вставок: len=%d\n", len(big))
	fmt.Println("Рехеширование происходит инкрементально (runtime).")

	fmt.Println("\n--- Итог ---")
	fmt.Println("Порядок обхода map рандомизирован (even between range loops)")
	fmt.Println("Go 1.24+: Swiss Table (бывшие цепочки по 8)")
	fmt.Println("Хеш-функция рандомизирована при каждом создании map")
}
