/*
    Authors: Gary Court and Austin Appleby
    Compatible with React Native Web
    https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/StyleSheet/compiler/hash.js#L65
*/
export const murmurhash2_32_gc = (str: string, seed: number) => {
    let l = str.length
    let h = seed ^ l
    let i = 0
    let k

    while (l >= 4) {
        k =
        (str.charCodeAt(i) & 0xff) |
        ((str.charCodeAt(++i) & 0xff) << 8) |
        ((str.charCodeAt(++i) & 0xff) << 16) |
        ((str.charCodeAt(++i) & 0xff) << 24)

        k =
        (k & 0xffff) * 0x5bd1e995 + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)
        k ^= k >>> 24
        k =
        (k & 0xffff) * 0x5bd1e995 + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)

        h =
        ((h & 0xffff) * 0x5bd1e995 +
          ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^
        k

        l -= 4
        ++i
    }

    switch (l) {
        // @ts-ignore
        case 3:
            h ^= (str.charCodeAt(i + 2) & 0xff) << 16
        // @ts-ignore
        case 2:
            h ^= (str.charCodeAt(i + 1) & 0xff) << 8
        case 1:
            h ^= str.charCodeAt(i) & 0xff
            h =
          (h & 0xffff) * 0x5bd1e995 +
          ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)
    }

    h ^= h >>> 13
    h = (h & 0xffff) * 0x5bd1e995 + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)
    h ^= h >>> 15

    return h >>> 0
}
