structstd.hash.murmur.Murmur2_64[src]

Functions

Functionhash[src]

pub fn hash(str: []const u8) u64

Parameters

str: []const u8

Source Code

Source code
pub fn hash(str: []const u8) u64 {
    return @call(.always_inline, Self.hashWithSeed, .{ str, default_seed });
}

FunctionhashWithSeed[src]

pub fn hashWithSeed(str: []const u8, seed: u64) u64

Parameters

str: []const u8
seed: u64

Source Code

Source code
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;
}

FunctionhashUint32[src]

pub fn hashUint32(v: u32) u64

Parameters

v: u32

Source Code

Source code
pub fn hashUint32(v: u32) u64 {
    return @call(.always_inline, Self.hashUint32WithSeed, .{ v, default_seed });
}

FunctionhashUint32WithSeed[src]

pub fn hashUint32WithSeed(v: u32, seed: u64) u64

Parameters

v: u32
seed: u64

Source Code

Source code
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;
}

FunctionhashUint64[src]

pub fn hashUint64(v: u64) u64

Parameters

v: u64

Source Code

Source code
pub fn hashUint64(v: u64) u64 {
    return @call(.always_inline, Self.hashUint64WithSeed, .{ v, default_seed });
}

FunctionhashUint64WithSeed[src]

pub fn hashUint64WithSeed(v: u64, seed: u64) u64

Parameters

v: u64
seed: u64

Source Code

Source code
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;
}

Source Code

Source 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;
    }
}