aboutsummaryrefslogtreecommitdiff
path: root/lib/std/hash_map.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-07-27 07:12:54 +0000
committerGitHub <noreply@github.com>2020-07-27 07:12:54 +0000
commit5139aa7ba4ccbe1c8bc435dc3c8c38cb9887de6f (patch)
tree91e9bb6000396886aa3ddf9c51919596e7519752 /lib/std/hash_map.zig
parent6cc72af03df86796251f2bca49fa45a006e67be5 (diff)
parentf67ce1e35fe3ecf19b50f64b9fe2d85747f7934d (diff)
downloadzig-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.zig11
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;
}