function MurmurHash3(key, seed = 0) {
    function rotl32(x, r) {
        return (x << r) | (x >>> (32 - r));
    }

    var c1 = 3432918353, c2 = 461845907;
    var h = seed;

    for(var i = 0, k, chunk = -4 & key.length; i < chunk; i += 4) {
        k = key[i+3] << 24 | key[i+2] << 16 | key[i+1] << 8 | key[i];
        k = Math.imul(k, c1);
        k = rotl32(k, 15);
        k = Math.imul(k, c2);
        h ^= k;
        h = rotl32(h, 13);
        h = Math.imul(h, 5) + 3864292196;
    }

    k = 0;
    switch (3 & key.length) {
        case 3: k ^= key[i+2] << 16;
        case 2: k ^= key[i+1] << 8;
        case 1: k ^= key[i];
                k = Math.imul(k, c1);
                k = rotl32(k, 15);
                k = Math.imul(k, c2);
                h ^= k;
    }

    h ^= key.length;
    h ^= h >>> 16;
    h = Math.imul(h, 2246822507);
    h ^= h >>> 13;
    h = Math.imul(h, 3266489909);
    h ^= h >>> 16;

    return h >>> 0;
}