struct Murmur2_32 [src]

Alias for std.hash.murmur.Murmur2_32

Members

Source

pub const Murmur2_32 = struct { const Self = @This(); pub fn hash(str: []const u8) u32 { return @call(.always_inline, Self.hashWithSeed, .{ str, default_seed }); } pub fn hashWithSeed(str: []const u8, seed: u32) u32 { const m: u32 = 0x5bd1e995; const len: u32 = @truncate(str.len); var h1: u32 = seed ^ len; for (@as([*]align(1) const u32, @ptrCast(str.ptr))[0..(len >> 2)]) |v| { var k1: u32 = v; if (native_endian == .big) k1 = @byteSwap(k1); k1 *%= m; k1 ^= k1 >> 24; k1 *%= m; h1 *%= m; h1 ^= k1; } const offset = len & 0xfffffffc; const rest = len & 3; if (rest >= 3) { h1 ^= @as(u32, @intCast(str[offset + 2])) << 16; } if (rest >= 2) { h1 ^= @as(u32, @intCast(str[offset + 1])) << 8; } if (rest >= 1) { h1 ^= @as(u32, @intCast(str[offset + 0])); h1 *%= m; } h1 ^= h1 >> 13; h1 *%= m; h1 ^= h1 >> 15; return h1; } pub fn hashUint32(v: u32) u32 { return @call(.always_inline, Self.hashUint32WithSeed, .{ v, default_seed }); } pub fn hashUint32WithSeed(v: u32, seed: u32) u32 { const m: u32 = 0x5bd1e995; const len: u32 = 4; var h1: u32 = seed ^ len; var k1: u32 = undefined; k1 = v *% m; k1 ^= k1 >> 24; k1 *%= m; h1 *%= m; h1 ^= k1; h1 ^= h1 >> 13; h1 *%= m; h1 ^= h1 >> 15; return h1; } pub fn hashUint64(v: u64) u32 { return @call(.always_inline, Self.hashUint64WithSeed, .{ v, default_seed }); } pub fn hashUint64WithSeed(v: u64, seed: u32) u32 { const m: u32 = 0x5bd1e995; const len: u32 = 8; var h1: u32 = seed ^ len; var k1: u32 = undefined; k1 = @as(u32, @truncate(v)) *% m; k1 ^= k1 >> 24; k1 *%= m; h1 *%= m; h1 ^= k1; k1 = @as(u32, @truncate(v >> 32)) *% m; k1 ^= k1 >> 24; k1 *%= m; h1 *%= m; h1 ^= k1; h1 ^= h1 >> 13; h1 *%= m; h1 ^= h1 >> 15; return h1; } }