export function fnv1a32(str) {
  let h = 0x811c9dc5;
  for (let i = 0; i < str.length; i++) {
    h ^= str.charCodeAt(i);
    h = Math.imul(h, 0x01000193);
  }
  return h >>> 0;
}

export function hash2u32(a, b, seed = 0) {
  // 2D integer hash -> uint32 (cheap, stable)
  let x = (a | 0) + 0x9e3779b9 + (seed | 0);
  let y = (b | 0) + 0x85ebca6b;
  x ^= y + 0x27d4eb2d + (x << 6) + (x >>> 2);
  x = Math.imul(x ^ (x >>> 16), 0x7feb352d);
  x = Math.imul(x ^ (x >>> 15), 0x846ca68b);
  x ^= x >>> 16;
  return x >>> 0;
}

export function mulberry32(seedU32) {
  let t = seedU32 >>> 0;
  return function rand() {
    t += 0x6d2b79f5;
    let r = Math.imul(t ^ (t >>> 15), 1 | t);
    r ^= r + Math.imul(r ^ (r >>> 7), 61 | r);
    return ((r ^ (r >>> 14)) >>> 0) / 4294967296;
  };
}

