namespace InfiniteWorld.VoxelWorld
{
    internal static class WorldSeedUtility
    {
        public static uint Hash(params int[] values)
        {
            uint hash = 2166136261u;
            for (int i = 0; i < values.Length; i++)
            {
                hash ^= unchecked((uint)values[i]);
                hash *= 16777619u;
                hash ^= hash >> 13;
                hash *= 1274126177u;
            }

            return hash;
        }

        public static float Value01(uint hash)
        {
            return (hash & 0x00FFFFFFu) / 16777215f;
        }

        public static int Range(uint hash, int minInclusive, int maxExclusive)
        {
            if (maxExclusive <= minInclusive)
            {
                return minInclusive;
            }

            return minInclusive + (int)(hash % (uint)(maxExclusive - minInclusive));
        }

        public static long ToStableId(uint hashA, uint hashB)
        {
            return ((long)hashA << 32) | hashB;
        }
    }
}
