diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-07-27 07:12:54 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-27 07:12:54 +0000 |
| commit | 5139aa7ba4ccbe1c8bc435dc3c8c38cb9887de6f (patch) | |
| tree | 91e9bb6000396886aa3ddf9c51919596e7519752 /lib/std/hash_map.zig | |
| parent | 6cc72af03df86796251f2bca49fa45a006e67be5 (diff) | |
| parent | f67ce1e35fe3ecf19b50f64b9fe2d85747f7934d (diff) | |
| download | zig-5139aa7ba4ccbe1c8bc435dc3c8c38cb9887de6f.tar.gz zig-5139aa7ba4ccbe1c8bc435dc3c8c38cb9887de6f.zip | |
Merge pull request #5932 from Sahnvour/hash
new trait `hasUniqueRepresentation` and hashmap speedup
Diffstat (limited to 'lib/std/hash_map.zig')
| -rw-r--r-- | lib/std/hash_map.zig | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/std/hash_map.zig b/lib/std/hash_map.zig index 3952ecb4b2..c81def3a00 100644 --- a/lib/std/hash_map.zig +++ b/lib/std/hash_map.zig @@ -5,6 +5,7 @@ const testing = std.testing; const math = std.math; const mem = std.mem; const meta = std.meta; +const trait = meta.trait; const autoHash = std.hash.autoHash; const Wyhash = std.hash.Wyhash; const Allocator = mem.Allocator; @@ -1023,9 +1024,13 @@ pub fn getTrivialEqlFn(comptime K: type) (fn (K, K) bool) { pub fn getAutoHashFn(comptime K: type) (fn (K) u32) { return struct { fn hash(key: K) u32 { - var hasher = Wyhash.init(0); - autoHash(&hasher, key); - return @truncate(u32, hasher.final()); + if (comptime trait.hasUniqueRepresentation(K)) { + return @truncate(u32, Wyhash.hash(0, std.mem.asBytes(&key))); + } else { + var hasher = Wyhash.init(0); + autoHash(&hasher, key); + return @truncate(u32, hasher.final()); + } } }.hash; } |
