std/hash: perform iterative + smhasher tests at comptime
Need to confirm how these fare on CI as per previous comments left which stated OOM (on stage-1).
This commit is contained in:
@@ -350,13 +350,27 @@ fn CityHash32hashIgnoreSeed(str: []const u8, seed: u32) u32 {
|
||||
const verify = @import("verify.zig");
|
||||
|
||||
test "cityhash32" {
|
||||
// Note: SMHasher doesn't provide a 32bit version of the algorithm.
|
||||
// Note: The implementation was verified against the Google Abseil version.
|
||||
try std.testing.expectEqual(verify.smhasher(CityHash32hashIgnoreSeed), 0x68254F81);
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
// SMHasher doesn't provide a 32bit version of the algorithm.
|
||||
// The implementation was verified against the Google Abseil version.
|
||||
try std.testing.expectEqual(verify.smhasher(CityHash32hashIgnoreSeed), 0x68254F81);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(75000);
|
||||
try comptime Test.do();
|
||||
}
|
||||
|
||||
test "cityhash64" {
|
||||
// Note: This is not compliant with the SMHasher implementation of CityHash64!
|
||||
// Note: The implementation was verified against the Google Abseil version.
|
||||
try std.testing.expectEqual(verify.smhasher(CityHash64.hashWithSeed), 0x5FABC5C5);
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
// This is not compliant with the SMHasher implementation of CityHash64!
|
||||
// The implementation was verified against the Google Abseil version.
|
||||
try std.testing.expectEqual(verify.smhasher(CityHash64.hashWithSeed), 0x5FABC5C5);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(75000);
|
||||
try comptime Test.do();
|
||||
}
|
||||
|
||||
@@ -282,7 +282,6 @@ pub const Murmur3_32 = struct {
|
||||
const verify = @import("verify.zig");
|
||||
|
||||
test "murmur2_32" {
|
||||
try testing.expectEqual(verify.smhasher(Murmur2_32.hashWithSeed), 0x27864C1E);
|
||||
var v0: u32 = 0x12345678;
|
||||
var v1: u64 = 0x1234567812345678;
|
||||
var v0le: u32 = v0;
|
||||
@@ -295,8 +294,18 @@ test "murmur2_32" {
|
||||
try testing.expectEqual(Murmur2_32.hash(@as([*]u8, @ptrCast(&v1le))[0..8]), Murmur2_32.hashUint64(v1));
|
||||
}
|
||||
|
||||
test "murmur2_32 smhasher" {
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try testing.expectEqual(verify.smhasher(Murmur2_32.hashWithSeed), 0x27864C1E);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(30000);
|
||||
try comptime Test.do();
|
||||
}
|
||||
|
||||
test "murmur2_64" {
|
||||
try std.testing.expectEqual(verify.smhasher(Murmur2_64.hashWithSeed), 0x1F0D3804);
|
||||
var v0: u32 = 0x12345678;
|
||||
var v1: u64 = 0x1234567812345678;
|
||||
var v0le: u32 = v0;
|
||||
@@ -309,8 +318,18 @@ test "murmur2_64" {
|
||||
try testing.expectEqual(Murmur2_64.hash(@as([*]u8, @ptrCast(&v1le))[0..8]), Murmur2_64.hashUint64(v1));
|
||||
}
|
||||
|
||||
test "mumur2_64 smhasher" {
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try std.testing.expectEqual(verify.smhasher(Murmur2_64.hashWithSeed), 0x1F0D3804);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(30000);
|
||||
try comptime Test.do();
|
||||
}
|
||||
|
||||
test "murmur3_32" {
|
||||
try std.testing.expectEqual(verify.smhasher(Murmur3_32.hashWithSeed), 0xB0F57EE3);
|
||||
var v0: u32 = 0x12345678;
|
||||
var v1: u64 = 0x1234567812345678;
|
||||
var v0le: u32 = v0;
|
||||
@@ -322,3 +341,14 @@ test "murmur3_32" {
|
||||
try testing.expectEqual(Murmur3_32.hash(@as([*]u8, @ptrCast(&v0le))[0..4]), Murmur3_32.hashUint32(v0));
|
||||
try testing.expectEqual(Murmur3_32.hash(@as([*]u8, @ptrCast(&v1le))[0..8]), Murmur3_32.hashUint64(v1));
|
||||
}
|
||||
|
||||
test "mumur3_32 smhasher" {
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try std.testing.expectEqual(verify.smhasher(Murmur3_32.hashWithSeed), 0xB0F57EE3);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(30000);
|
||||
try comptime Test.do();
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ fn initMaybeSeed(comptime Hash: anytype, seed: anytype) Hash {
|
||||
}
|
||||
}
|
||||
|
||||
// Returns a verification code, the same as user by SMHasher.
|
||||
// Returns a verification code, the same as used by SMHasher.
|
||||
//
|
||||
// Hash keys of the form {0}, {0,1}, {0,1,2}... up to N=255, using 256-N as seed.
|
||||
// First four-bytes of the hash, interpreted as little-endian is the verification code.
|
||||
|
||||
@@ -66,7 +66,7 @@ pub const Wyhash = struct {
|
||||
}
|
||||
|
||||
pub fn final(self: *Wyhash) u64 {
|
||||
var input = self.buf[0..self.buf_len];
|
||||
var input: []const u8 = self.buf[0..self.buf_len];
|
||||
var newSelf = self.shallowCopy(); // ensure idempotency
|
||||
|
||||
if (self.total_len <= 16) {
|
||||
@@ -231,11 +231,25 @@ test "test vectors at comptime" {
|
||||
}
|
||||
|
||||
test "smhasher" {
|
||||
try expectEqual(verify.smhasher(Wyhash.hash), 0xBD5E840C);
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try expectEqual(verify.smhasher(Wyhash.hash), 0xBD5E840C);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(50000);
|
||||
try comptime Test.do();
|
||||
}
|
||||
|
||||
test "iterative api" {
|
||||
try verify.iterativeApi(Wyhash);
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try verify.iterativeApi(Wyhash);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(50000);
|
||||
try comptime Test.do();
|
||||
}
|
||||
|
||||
test "iterative maintains last sixteen" {
|
||||
|
||||
@@ -457,12 +457,28 @@ test "xxhash64" {
|
||||
try testExpect(H, 0, "abcdefghijklmnopqrstuvwxyz", 0xcfe1f278fa89835c);
|
||||
try testExpect(H, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 0xaaa46907d3047814);
|
||||
try testExpect(H, 0, "12345678901234567890123456789012345678901234567890123456789012345678901234567890", 0xe04a477f19ee145d);
|
||||
}
|
||||
|
||||
try expectEqual(verify.smhasher(H.hash), 0x024B7CF4);
|
||||
test "xxhash64 smhasher" {
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try expectEqual(verify.smhasher(XxHash64.hash), 0x024B7CF4);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(75000);
|
||||
comptime try Test.do();
|
||||
}
|
||||
|
||||
test "xxhash64 iterative api" {
|
||||
try verify.iterativeApi(XxHash64);
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try verify.iterativeApi(XxHash64);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(30000);
|
||||
comptime try Test.do();
|
||||
}
|
||||
|
||||
test "xxhash32" {
|
||||
@@ -475,10 +491,26 @@ test "xxhash32" {
|
||||
try testExpect(H, 0, "abcdefghijklmnopqrstuvwxyz", 0x63a14d5f);
|
||||
try testExpect(H, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 0x9c285e64);
|
||||
try testExpect(H, 0, "12345678901234567890123456789012345678901234567890123456789012345678901234567890", 0x9c05f475);
|
||||
}
|
||||
|
||||
try expectEqual(verify.smhasher(H.hash), 0xBA88B743);
|
||||
test "xxhash32 smhasher" {
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try expectEqual(verify.smhasher(XxHash32.hash), 0xBA88B743);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(75000);
|
||||
comptime try Test.do();
|
||||
}
|
||||
|
||||
test "xxhash32 iterative api" {
|
||||
try verify.iterativeApi(XxHash32);
|
||||
const Test = struct {
|
||||
fn do() !void {
|
||||
try verify.iterativeApi(XxHash32);
|
||||
}
|
||||
};
|
||||
try Test.do();
|
||||
@setEvalBranchQuota(30000);
|
||||
comptime try Test.do();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user