Клиент имеет простое увеличение номера заказа (1, 2, 3...). Он хочет, чтобы конечные пользователи получали "случайный" номер 8 или 9 цифр (цифры - без символов). Очевидно, что это "случайное" число фактически должно быть уникальным и обратимым (это действительно шифрование actualOrderNumber).
Моя первая мысль состояла в том, чтобы просто перетасовать несколько бит. Когда я показал клиенту пример последовательности, он жаловался, что последующие obfuscOrderNumbers увеличивались до тех пор, пока они не попали в точку "перетасовки" (точка, в которой играли младшие разряды). Он хочет, чтобы obfuscOrderNumbers были как можно более случайными.
Моя следующая мысль состояла в том, чтобы детерминировать семенной линейный конгруэнтный генератор псевдослучайных чисел, а затем принять значение actualOrderNumber th. Но в этом случае мне нужно беспокоиться о столкновениях - клиент хочет алгоритм, который гарантированно не столкнется, по крайней мере, в течение 10 ^ 7 циклов.
Моя третья мысль была "ах, просто зашифруйте чертовую вещь", но если я использую библиотеку шифрования запаса, мне придется ее обработать, чтобы получить только 8 или 9 цифр.
Моя четвертая мысль заключалась в том, чтобы интерпретировать биты actualOrderNumber как целое число с серым кодом и вернуть это.
Мой пятый, хотя был: "Я, наверное, слишком задумываюсь об этом. Держу пари, кто-то из StackOverflow может сделать это в нескольких строках кода".