🫘

Zig HashMap: カスタムハッシュ関数の利用

2023/12/07に公開

ziv version: 0.12.0-dev.1773+8a8fd47d2

Context 型を渡す必要があり、hash および eql という2つの関数を提供する必要があります。

https://github.com/ziglang/zig/blob/56deb5b0545c049f7445003d12e50a052088b994/lib/std/hash_map.zig#L53-L58

以下は例です。

const std = @import("std");

pub fn FnvContext(comptime K: type) type {
    return struct {
        pub fn hash(ctx: @This(), key: K) u64 {
            _ = ctx;
            return std.hash.Fnv1a_64.hash(key);
        }
        pub fn eql(ctx: @This(), a: K, b: K) bool {
            _ = ctx;
            return std.meta.eql(a, b);
        }
    };
}

pub fn FastHashMap(comptime K: type, comptime V: type) type {
    return std.HashMap(K, V, FnvContext(K), std.hash_map.default_max_load_percentage);
}

pub fn main() !void {
    var map = FastHashMap([]const u8, []const u8).init(std.heap.page_allocator);
    defer map.deinit();
    map.put("foo", "bar") catch unreachable;
    std.log.info("{s}", .{map.get("foo").?});
}

Discussion