У меня есть система, для которой требуется уникальный 6-значный код для представления объекта, и я пытаюсь представить хороший алгоритм для их создания. Вот предварительные требования:
- Я использую систему base-20 (без шапок, цифр, гласных или l, чтобы предотвратить путаницу и озорные слова)
- База-20 позволяет 64 миллиона комбинаций
- Я буду вставлять потенциально 5-10 тысяч записей одновременно, поэтому теоретически я бы использовал объемные вставки, а это значит, что использование уникального ключа, вероятно, не будет эффективным или красивым (особенно если начинается много столкновений )
- Невозможно заполнить 10% комбинаций, поэтому существует высокий потенциал для большого количества столкновений.
- Я хочу убедиться, что коды не являются последовательными
У меня была идея, которая звучит так, как будто это сработает, но я недостаточно разбираюсь в математике, чтобы понять, как ее реализовать: если я начинаю с 0 и увеличиваю на N, то конвертирую в base-20, кажется например, должно быть какое-то значение для N, которое позволяет мне подсчитать каждое значение от 0-63,999,999 до повторения любого.
Например, переход от 0 до 9 с использованием N = 3 (так 10 mod 3): 0, 3, 6, 9, 2, 5, 8, 1, 4, 7.
Есть ли какой-то магический математический метод для вычисления значений N для некоторого большего числа, который способен считать весь диапазон без повторения? В идеале, число, которое я выбрал, было бы скачкообразно скачкообразно перемещаться по множеству, так что было не очевидно, что существует шаблон, но я не уверен, насколько это возможно.
Альтернативно, алгоритм хэширования, гарантирующий уникальность для значений 0-64 миллионов, будет работать, но я слишком глуп, чтобы узнать, возможно ли это.