authorgravatar for andersfr@gmail.comandersfr <andersfr@gmail.com> 2019-07-06 22:41:38+02:00
committergravatar for andersfr@gmail.comandersfr <andersfr@gmail.com> 2019-07-13 13:59:15+02:00
log0619b525b9100e95ab293792bcaa3c565e08a979
treed203054de69bf35e6f715a00de144186954db4f2
parentdfbe65e8cd62625c5ef783aee01056bac678ecf1

Better testing and bugfix in hashUint* functions


1 files changed, 37 insertions(+), 14 deletions(-)

std/hash/murmur.zig+37-14
......@@ -1,5 +1,6 @@
11const std = @import("std");
22const builtin = @import("builtin");
3const testing = std.testing;
34
45const default_seed: u32 = 0xc70f6907;
56
......@@ -68,10 +69,10 @@ pub const Murmur2_32 = struct {
6869
6970 pub fn hashUint64WithSeed(v: u64, seed: u32) u32 {
7071 const m: u32 = 0x5bd1e995;
71 const len: u32 = 4;
72 const len: u32 = 8;
7273 var h1: u32 = seed ^ len;
7374 var k1: u32 = undefined;
74 k1 = @intCast(u32, v) *% m;
75 k1 = @intCast(u32, v & 0xffffffff) *% m;
7576 k1 ^= k1 >> 24;
7677 k1 *%= m;
7778 h1 *%= m;
......@@ -133,10 +134,7 @@ pub const Murmur2_64 = struct {
133134 const m: u64 = 0xc6a4a7935bd1e995;
134135 const len: u64 = 4;
135136 var h1: u64 = seed ^ (len *% m);
136 var k1: u64 = undefined;
137 k1 = v *% m;
138 k1 ^= k1 >> 47;
139 k1 *%= m;
137 var k1: u64 = v;
140138 h1 ^= k1;
141139 h1 *%= m;
142140 h1 ^= h1 >> 47;
......@@ -154,12 +152,7 @@ pub const Murmur2_64 = struct {
154152 const len: u64 = 8;
155153 var h1: u64 = seed ^ (len *% m);
156154 var k1: u64 = undefined;
157 k1 = @intCast(u32, v) *% m;
158 k1 ^= k1 >> 47;
159 k1 *%= m;
160 h1 ^= k1;
161 h1 *%= m;
162 k1 = @intCast(u32, v >> 32) *% m;
155 k1 = v *% m;
163156 k1 ^= k1 >> 47;
164157 k1 *%= m;
165158 h1 ^= k1;
......@@ -262,7 +255,7 @@ pub const Murmur3_32 = struct {
262255 const len: u32 = 8;
263256 var h1: u32 = seed;
264257 var k1: u32 = undefined;
265 k1 = @intCast(u32, v) *% c1;
258 k1 = @intCast(u32, v & 0xffffffff) *% c1;
266259 k1 = rotl32(k1, 15);
267260 k1 *%= c2;
268261 h1 ^= k1;
......@@ -310,13 +303,43 @@ fn SMHasherTest(comptime hash_fn: var, comptime hashbits: u32) u32 {
310303}
311304
312305test "murmur2_32" {
313 std.testing.expectEqual(SMHasherTest(Murmur2_32.hashWithSeed, 32), 0x27864C1E);
306 testing.expectEqual(SMHasherTest(Murmur2_32.hashWithSeed, 32), 0x27864C1E);
307 var v0: u32 = 0x12345678;
308 var v1: u64 = 0x1234567812345678;
309 var v0le: u32 = v0;
310 var v1le: u64 = v1;
311 if (builtin.endian == builtin.Endian.Big) {
312 v0le = @byteSwap(u32, v0le);
313 v1le = @byteSwap(u64, v1le);
314 }
315 testing.expectEqual(Murmur2_32.hash(@ptrCast([*]u8, &v0le)[0..4]), Murmur2_32.hashUint32(v0));
316 testing.expectEqual(Murmur2_32.hash(@ptrCast([*]u8, &v1le)[0..8]), Murmur2_32.hashUint64(v1));
314317}
315318
316319test "murmur2_64" {
317320 std.testing.expectEqual(SMHasherTest(Murmur2_64.hashWithSeed, 64), 0x1F0D3804);
321 var v0: u32 = 0x12345678;
322 var v1: u64 = 0x1234567812345678;
323 var v0le: u32 = v0;
324 var v1le: u64 = v1;
325 if (builtin.endian == builtin.Endian.Big) {
326 v0le = @byteSwap(u32, v0le);
327 v1le = @byteSwap(u64, v1le);
328 }
329 testing.expectEqual(Murmur2_64.hash(@ptrCast([*]u8, &v0le)[0..4]), Murmur2_64.hashUint32(v0));
330 testing.expectEqual(Murmur2_64.hash(@ptrCast([*]u8, &v1le)[0..8]), Murmur2_64.hashUint64(v1));
318331}
319332
320333test "murmur3_32" {
321334 std.testing.expectEqual(SMHasherTest(Murmur3_32.hashWithSeed, 32), 0xB0F57EE3);
335 var v0: u32 = 0x12345678;
336 var v1: u64 = 0x1234567812345678;
337 var v0le: u32 = v0;
338 var v1le: u64 = v1;
339 if (builtin.endian == builtin.Endian.Big) {
340 v0le = @byteSwap(u32, v0le);
341 v1le = @byteSwap(u64, v1le);
342 }
343 testing.expectEqual(Murmur3_32.hash(@ptrCast([*]u8, &v0le)[0..4]), Murmur3_32.hashUint32(v0));
344 testing.expectEqual(Murmur3_32.hash(@ptrCast([*]u8, &v1le)[0..8]), Murmur3_32.hashUint64(v1));
322345}