int h(unsigned int i, unsigned int m, int x)
{
    uint32_t rng_state = (x) ? x : 1;
    for (unsigned int j = 0; j < i; j++) {
        rng_state ^= rng_state << 13;
        rng_state ^= rng_state >> 17;
        rng_state ^= rng_state << 5;
    }
    return rng_state % m;
}
