structstd.hash.murmur.Murmur3_32[src]

Functions

Functionhash[src]

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

Parameters

str: []const u8

Source Code

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

FunctionhashWithSeed[src]

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

Parameters

str: []const u8
seed: u32

Source Code

Source code
pub fn hashWithSeed(str: []const u8, seed: u32) u32 {
    const c1: u32 = 0xcc9e2d51;
    const c2: u32 = 0x1b873593;
    const len: u32 = @truncate(str.len);
    var h1: u32 = seed;
    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 *%= c1;
        k1 = rotl32(k1, 15);
        k1 *%= c2;
        h1 ^= k1;
        h1 = rotl32(h1, 13);
        h1 *%= 5;
        h1 +%= 0xe6546b64;
    }
    {
        var k1: u32 = 0;
        const offset = len & 0xfffffffc;
        const rest = len & 3;
        if (rest == 3) {
            k1 ^= @as(u32, @intCast(str[offset + 2])) << 16;
        }
        if (rest >= 2) {
            k1 ^= @as(u32, @intCast(str[offset + 1])) << 8;
        }
        if (rest >= 1) {
            k1 ^= @as(u32, @intCast(str[offset + 0]));
            k1 *%= c1;
            k1 = rotl32(k1, 15);
            k1 *%= c2;
            h1 ^= k1;
        }
    }
    h1 ^= len;
    h1 ^= h1 >> 16;
    h1 *%= 0x85ebca6b;
    h1 ^= h1 >> 13;
    h1 *%= 0xc2b2ae35;
    h1 ^= h1 >> 16;
    return h1;
}

FunctionhashUint32[src]

pub fn hashUint32(v: u32) u32

Parameters

v: u32

Source Code

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

FunctionhashUint32WithSeed[src]

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

Parameters

v: u32
seed: u32

Source Code

Source code
pub fn hashUint32WithSeed(v: u32, seed: u32) u32 {
    const c1: u32 = 0xcc9e2d51;
    const c2: u32 = 0x1b873593;
    const len: u32 = 4;
    var h1: u32 = seed;
    var k1: u32 = undefined;
    k1 = v *% c1;
    k1 = rotl32(k1, 15);
    k1 *%= c2;
    h1 ^= k1;
    h1 = rotl32(h1, 13);
    h1 *%= 5;
    h1 +%= 0xe6546b64;
    h1 ^= len;
    h1 ^= h1 >> 16;
    h1 *%= 0x85ebca6b;
    h1 ^= h1 >> 13;
    h1 *%= 0xc2b2ae35;
    h1 ^= h1 >> 16;
    return h1;
}

FunctionhashUint64[src]

pub fn hashUint64(v: u64) u32

Parameters

v: u64

Source Code

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

FunctionhashUint64WithSeed[src]

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

Parameters

v: u64
seed: u32

Source Code

Source code
pub fn hashUint64WithSeed(v: u64, seed: u32) u32 {
    const c1: u32 = 0xcc9e2d51;
    const c2: u32 = 0x1b873593;
    const len: u32 = 8;
    var h1: u32 = seed;
    var k1: u32 = undefined;
    k1 = @as(u32, @truncate(v)) *% c1;
    k1 = rotl32(k1, 15);
    k1 *%= c2;
    h1 ^= k1;
    h1 = rotl32(h1, 13);
    h1 *%= 5;
    h1 +%= 0xe6546b64;
    k1 = @as(u32, @truncate(v >> 32)) *% c1;
    k1 = rotl32(k1, 15);
    k1 *%= c2;
    h1 ^= k1;
    h1 = rotl32(h1, 13);
    h1 *%= 5;
    h1 +%= 0xe6546b64;
    h1 ^= len;
    h1 ^= h1 >> 16;
    h1 *%= 0x85ebca6b;
    h1 ^= h1 >> 13;
    h1 *%= 0xc2b2ae35;
    h1 ^= h1 >> 16;
    return h1;
}

Source Code

Source code
pub const Murmur3_32 = struct {
    const Self = @This();

    fn rotl32(x: u32, comptime r: u32) u32 {
        return (x << r) | (x >> (32 - r));
    }

    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 c1: u32 = 0xcc9e2d51;
        const c2: u32 = 0x1b873593;
        const len: u32 = @truncate(str.len);
        var h1: u32 = seed;
        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 *%= c1;
            k1 = rotl32(k1, 15);
            k1 *%= c2;
            h1 ^= k1;
            h1 = rotl32(h1, 13);
            h1 *%= 5;
            h1 +%= 0xe6546b64;
        }
        {
            var k1: u32 = 0;
            const offset = len & 0xfffffffc;
            const rest = len & 3;
            if (rest == 3) {
                k1 ^= @as(u32, @intCast(str[offset + 2])) << 16;
            }
            if (rest >= 2) {
                k1 ^= @as(u32, @intCast(str[offset + 1])) << 8;
            }
            if (rest >= 1) {
                k1 ^= @as(u32, @intCast(str[offset + 0]));
                k1 *%= c1;
                k1 = rotl32(k1, 15);
                k1 *%= c2;
                h1 ^= k1;
            }
        }
        h1 ^= len;
        h1 ^= h1 >> 16;
        h1 *%= 0x85ebca6b;
        h1 ^= h1 >> 13;
        h1 *%= 0xc2b2ae35;
        h1 ^= h1 >> 16;
        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 c1: u32 = 0xcc9e2d51;
        const c2: u32 = 0x1b873593;
        const len: u32 = 4;
        var h1: u32 = seed;
        var k1: u32 = undefined;
        k1 = v *% c1;
        k1 = rotl32(k1, 15);
        k1 *%= c2;
        h1 ^= k1;
        h1 = rotl32(h1, 13);
        h1 *%= 5;
        h1 +%= 0xe6546b64;
        h1 ^= len;
        h1 ^= h1 >> 16;
        h1 *%= 0x85ebca6b;
        h1 ^= h1 >> 13;
        h1 *%= 0xc2b2ae35;
        h1 ^= h1 >> 16;
        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 c1: u32 = 0xcc9e2d51;
        const c2: u32 = 0x1b873593;
        const len: u32 = 8;
        var h1: u32 = seed;
        var k1: u32 = undefined;
        k1 = @as(u32, @truncate(v)) *% c1;
        k1 = rotl32(k1, 15);
        k1 *%= c2;
        h1 ^= k1;
        h1 = rotl32(h1, 13);
        h1 *%= 5;
        h1 +%= 0xe6546b64;
        k1 = @as(u32, @truncate(v >> 32)) *% c1;
        k1 = rotl32(k1, 15);
        k1 *%= c2;
        h1 ^= k1;
        h1 = rotl32(h1, 13);
        h1 *%= 5;
        h1 +%= 0xe6546b64;
        h1 ^= len;
        h1 ^= h1 >> 16;
        h1 *%= 0x85ebca6b;
        h1 ^= h1 >> 13;
        h1 *%= 0xc2b2ae35;
        h1 ^= h1 >> 16;
        return h1;
    }
}