public static Dictionary <int, Int32Range> GetRanges(int numShards)
        {
            if (numShards < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(numShards), numShards, "numShards cannot be less than 1.");
            }

            var ranges = new Dictionary <int, Int32Range>(numShards);

            const uint totalNumbersInRangeType = uint.MaxValue;
            var        rangeSize = (uint)Math.Ceiling(totalNumbersInRangeType / (decimal)numShards);

            int shardNumber = 1;
            int lowValue    = int.MinValue;

            while (shardNumber < numShards)
            {
                var highValue  = (int)(lowValue + rangeSize);
                var shardRange = new Int32Range(lowValue, highValue);
                ranges.Add(shardNumber, shardRange);

                shardNumber++;
                lowValue = highValue;
            }

            // last range
            if (lowValue < int.MaxValue)
            {
                var highValue = (lowValue + rangeSize);
                if (highValue > int.MaxValue)
                {
                    highValue = int.MaxValue;
                }
                var lastShardRange = new Int32Range(lowValue, (int)highValue);
                ranges.Add(numShards, lastShardRange);
            }

            return(ranges);
        }
        public static Dictionary<int, Int32Range> GetRanges(int numShards)
        {
            if (numShards < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(numShards), numShards, "numShards cannot be less than 1.");
            }

            var ranges = new Dictionary<int, Int32Range>(numShards);

            const uint totalNumbersInRangeType = uint.MaxValue;
            var rangeSize = (uint)Math.Ceiling(totalNumbersInRangeType / (decimal)numShards);

            int shardNumber = 1;
            int lowValue = int.MinValue;
            while (shardNumber < numShards)
            {
                var highValue = (int)(lowValue + rangeSize);
                var shardRange = new Int32Range(lowValue, highValue);
                ranges.Add(shardNumber, shardRange);

                shardNumber++;
                lowValue = highValue;
            }

            // last range
            if (lowValue < int.MaxValue)
            {
                var highValue = (lowValue + rangeSize);
                if (highValue > int.MaxValue)
                {
                    highValue = int.MaxValue;
                }
                var lastShardRange = new Int32Range(lowValue, (int)highValue);
                ranges.Add(numShards, lastShardRange);
            }

            return ranges;
        }