// Хеш-таблицы: рандомизация, коллизии и порядок
// Компиляция: zig build-exe hash_demo.zig && ./hash_demo

const std = @import("std");

pub fn main() !void {
    const stdout = std.fs.File.stdout().deprecatedWriter();

    try stdout.print("=== Zig: хеш-таблицы ===\n\n", .{});

    // 1. std.HashMap (не сохраняет порядок)
    try stdout.print("--- 1. std.AutoHashMap ---\n", .{});
    var map = std.StringHashMap(i32).init(std.heap.page_allocator);
    defer map.deinit();

    try map.put("alpha", 1);
    try map.put("beta", 2);
    try map.put("gamma", 3);
    try map.put("delta", 4);

    try stdout.print("Вставлено: alpha, beta, gamma, delta\n", .{});
    try stdout.print("Порядок обхода: ", .{});
    var iter = map.iterator();
    while (iter.next()) |entry| {
        try stdout.print("{s} ", .{entry.key_ptr.*});
    }
    try stdout.print("\n(Порядок определяется хеш-функцией, не вставкой)\n\n", .{});

    // 2. Хеш-функция Zig
    try stdout.print("--- 2. Хеш-функция ---\n", .{});
    try stdout.print("Zig использует Wyhash по умолчанию.\n", .{});
    const hash1 = std.hash.Wyhash.hash(0, "hello");
    const hash2 = std.hash.Wyhash.hash(0, "hello");
    const hash3 = std.hash.Wyhash.hash(42, "hello");
    try stdout.print("wyhash(0, \"hello\") = {x:0>16}\n", .{hash1});
    try stdout.print("wyhash(0, \"hello\") = {x:0>16} (детерминирован)\n", .{hash2});
    try stdout.print("wyhash(42,\"hello\") = {x:0>16} (другой seed)\n\n", .{hash3});

    // 3. Аллокатор явно передаётся
    try stdout.print("--- 3. Явный аллокатор ---\n", .{});
    try stdout.print("HashMap требует аллокатор при создании:\n", .{});
    try stdout.print("  std.AutoHashMap(K, V).init(allocator)\n", .{});
    try stdout.print("Это позволяет использовать арену, стек или пул.\n", .{});
    try stdout.print("В C++ и Go аллокатор скрыт; в Zig — явный.\n\n", .{});

    // 4. Lookup
    try stdout.print("--- 4. Поиск ---\n", .{});
    if (map.get("beta")) |val| {
        try stdout.print("map.get(\"beta\") = {d}\n", .{val});
    }
    if (map.get("omega")) |_| {
        try stdout.print("omega найден\n", .{});
    } else {
        try stdout.print("map.get(\"omega\") = null\n", .{});
    }

    try stdout.print("\n--- Итог ---\n", .{});
    try stdout.print("Zig HashMap: открытая адресация, Wyhash по умолчанию\n", .{});
    try stdout.print("Аллокатор передаётся явно\n", .{});
    try stdout.print("Порядок обхода не гарантирован\n", .{});
    try stdout.print("Нет встроенной рандомизации seed (в отличие от Rust/Go)\n", .{});
}
