Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › hash/ › murmur.zig › Murmur2_64
Murmur2_64
murmur.Murmur2_64
pub const Murmur2_64 = struct
File
Code
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 ;
}
}