struct Murmur2_64 [src]

Alias for std.hash.murmur.Murmur2_64

Members

Source

pub const Murmur2_64 = struct { const Self = @This(); pub fn hash(str: []const u8) u64 { return @call(.always_inline, Self.hashWithSeed, .{ str, default_seed }); } pub fn hashWithSeed(str: []const u8, seed: u64) u64 { const m: u64 = 0xc6a4a7935bd1e995; var h1: u64 = seed ^ (@as(u64, str.len) *% m); for (@as([*]align(1) const u64, @ptrCast(str.ptr))[0 .. str.len / 8]) |v| { var k1: u64 = v; if (native_endian == .big) k1 = @byteSwap(k1); k1 *%= m; k1 ^= k1 >> 47; k1 *%= m; h1 ^= k1; h1 *%= m; } const rest = str.len & 7; const offset = str.len - rest; if (rest > 0) { var k1: u64 = 0; @memcpy(@as([*]u8, @ptrCast(&k1))[0..rest], str[offset..]); if (native_endian == .big) k1 = @byteSwap(k1); h1 ^= k1; h1 *%= m; } h1 ^= h1 >> 47; h1 *%= m; h1 ^= h1 >> 47; return h1; } pub fn hashUint32(v: u32) u64 { return @call(.always_inline, Self.hashUint32WithSeed, .{ v, default_seed }); } pub fn hashUint32WithSeed(v: u32, seed: u64) u64 { const m: u64 = 0xc6a4a7935bd1e995; const len: u64 = 4; var h1: u64 = seed ^ (len *% m); const k1: u64 = v; h1 ^= k1; h1 *%= m; h1 ^= h1 >> 47; h1 *%= m; h1 ^= h1 >> 47; return h1; } pub fn hashUint64(v: u64) u64 { return @call(.always_inline, Self.hashUint64WithSeed, .{ v, default_seed }); } pub fn hashUint64WithSeed(v: u64, seed: u64) u64 { const m: u64 = 0xc6a4a7935bd1e995; const len: u64 = 8; var h1: u64 = seed ^ (len *% m); var k1: u64 = undefined; k1 = v *% m; k1 ^= k1 >> 47; k1 *%= m; h1 ^= k1; h1 *%= m; h1 ^= h1 >> 47; h1 *%= m; h1 ^= h1 >> 47; return h1; } }