Commit 0619b525b9

andersfr <andersfr@gmail.com>
2019-07-06 22:41:38
Better testing and bugfix in hashUint* functions
1 parent dfbe65e
Changed files (1)
std
std/hash/murmur.zig
@@ -1,5 +1,6 @@
 const std = @import("std");
 const builtin = @import("builtin");
+const testing = std.testing;
 
 const default_seed: u32 = 0xc70f6907;
 
@@ -68,10 +69,10 @@ pub const Murmur2_32 = struct {
 
     pub fn hashUint64WithSeed(v: u64, seed: u32) u32 {
         const m: u32 = 0x5bd1e995;
-        const len: u32 = 4;
+        const len: u32 = 8;
         var h1: u32 = seed ^ len;
         var k1: u32 = undefined;
-        k1 = @intCast(u32, v) *% m;
+        k1 = @intCast(u32, v & 0xffffffff) *% m;
         k1 ^= k1 >> 24;
         k1 *%= m;
         h1 *%= m;
@@ -133,10 +134,7 @@ pub const Murmur2_64 = struct {
         const m: u64 = 0xc6a4a7935bd1e995;
         const len: u64 = 4;
         var h1: u64 = seed ^ (len *% m);
-        var k1: u64 = undefined;
-        k1 = v *% m;
-        k1 ^= k1 >> 47;
-        k1 *%= m;
+        var k1: u64 = v;
         h1 ^= k1;
         h1 *%= m;
         h1 ^= h1 >> 47;
@@ -154,12 +152,7 @@ pub const Murmur2_64 = struct {
         const len: u64 = 8;
         var h1: u64 = seed ^ (len *% m);
         var k1: u64 = undefined;
-        k1 = @intCast(u32, v) *% m;
-        k1 ^= k1 >> 47;
-        k1 *%= m;
-        h1 ^= k1;
-        h1 *%= m;
-        k1 = @intCast(u32, v >> 32) *% m;
+        k1 = v *% m;
         k1 ^= k1 >> 47;
         k1 *%= m;
         h1 ^= k1;
@@ -262,7 +255,7 @@ pub const Murmur3_32 = struct {
         const len: u32 = 8;
         var h1: u32 = seed;
         var k1: u32 = undefined;
-        k1 = @intCast(u32, v) *% c1;
+        k1 = @intCast(u32, v & 0xffffffff) *% c1;
         k1 = rotl32(k1, 15);
         k1 *%= c2;
         h1 ^= k1;
@@ -310,13 +303,43 @@ fn SMHasherTest(comptime hash_fn: var, comptime hashbits: u32) u32 {
 }
 
 test "murmur2_32" {
-    std.testing.expectEqual(SMHasherTest(Murmur2_32.hashWithSeed, 32), 0x27864C1E);
+    testing.expectEqual(SMHasherTest(Murmur2_32.hashWithSeed, 32), 0x27864C1E);
+    var v0: u32 = 0x12345678;
+    var v1: u64 = 0x1234567812345678;
+    var v0le: u32 = v0;
+    var v1le: u64 = v1;
+    if (builtin.endian == builtin.Endian.Big) {
+        v0le = @byteSwap(u32, v0le);
+        v1le = @byteSwap(u64, v1le);
+    }
+    testing.expectEqual(Murmur2_32.hash(@ptrCast([*]u8, &v0le)[0..4]), Murmur2_32.hashUint32(v0));
+    testing.expectEqual(Murmur2_32.hash(@ptrCast([*]u8, &v1le)[0..8]), Murmur2_32.hashUint64(v1));
 }
 
 test "murmur2_64" {
     std.testing.expectEqual(SMHasherTest(Murmur2_64.hashWithSeed, 64), 0x1F0D3804);
+    var v0: u32 = 0x12345678;
+    var v1: u64 = 0x1234567812345678;
+    var v0le: u32 = v0;
+    var v1le: u64 = v1;
+    if (builtin.endian == builtin.Endian.Big) {
+        v0le = @byteSwap(u32, v0le);
+        v1le = @byteSwap(u64, v1le);
+    }
+    testing.expectEqual(Murmur2_64.hash(@ptrCast([*]u8, &v0le)[0..4]), Murmur2_64.hashUint32(v0));
+    testing.expectEqual(Murmur2_64.hash(@ptrCast([*]u8, &v1le)[0..8]), Murmur2_64.hashUint64(v1));
 }
 
 test "murmur3_32" {
     std.testing.expectEqual(SMHasherTest(Murmur3_32.hashWithSeed, 32), 0xB0F57EE3);
+    var v0: u32 = 0x12345678;
+    var v1: u64 = 0x1234567812345678;
+    var v0le: u32 = v0;
+    var v1le: u64 = v1;
+    if (builtin.endian == builtin.Endian.Big) {
+        v0le = @byteSwap(u32, v0le);
+        v1le = @byteSwap(u64, v1le);
+    }
+    testing.expectEqual(Murmur3_32.hash(@ptrCast([*]u8, &v0le)[0..4]), Murmur3_32.hashUint32(v0));
+    testing.expectEqual(Murmur3_32.hash(@ptrCast([*]u8, &v1le)[0..8]), Murmur3_32.hashUint64(v1));
 }