public Hsl BuildToHsl(string value) { double h, s, l; var hashGenerator = new BKDRHash(); var hash = hashGenerator.Generate(value); if (_options.HueRanges.Count > 0) { var rangeIndex = hash % Convert.ToUInt64(_options.HueRanges.Count); //TODO: Convert int? prevent error var hueValue = (Hue)_options.HueRanges[(int)rangeIndex]; var hueResolution = Convert.ToUInt64(727); h = ((hash / Convert.ToUInt64(_options.HueRanges.Count)) % hueResolution) * (Convert.ToUInt64(hueValue.Max) - Convert.ToUInt64(hueValue.Min)) / hueResolution + Convert.ToUInt64(hueValue.Min); } else { h = hash % 359; // note that 359 is a prime } hash = (hash / 360); var sIndex = (hash % (ulong)_options.S.Count); s = (double)_options.S[(int)sIndex]; hash = (hash / (ulong)_options.S.Count); var lIndex = (hash % (ulong)_options.L.Count); l = (double)_options.L[(int)lIndex]; var hslResult = new Hsl(h, s, l); return(hslResult); }