У меня есть система, которая требует уникального 6-значного кода для представления объекта, и я пытаюсь придумать хороший алгоритм для их создания. Вот предварительные требования:
- I'm using a base-20 system (no caps, numbers, vowels, or l to prevent confusion and naughty words)
- The base-20 allows 64 million combinations
- Я буду вставлять потенциально 5-10 тысяч записей за один раз, поэтому теоретически я бы использовал массовые вставки, что означает, что использование уникального ключа, вероятно, не будет эффективным или красивым (особенно, если начинается много коллизий)
- Не исключено заполнение 10% комбинаций, поэтому существует высокий потенциал для множества коллизий.
- Я хочу убедиться, что коды не последовательные
У меня была идея, которая звучала так, как будто она сработает, но я недостаточно разбираюсь в математике, чтобы понять, как ее реализовать: если я начну с 0 и увеличу на N, а затем конвертирую в base-20, кажется, что должен быть некоторым значением для N, которое позволяет мне подсчитывать каждое значение от 0 до 63 999 999 перед повторением любого.
Например, переход от 0 до 9 с использованием N = 3 (то есть 10 по модулю 3): 0, 3, 6, 9, 2, 5, 8, 1, 4, 7.
Есть ли какой-нибудь волшебный математический метод для определения значений N для некоторого большего числа, который может считать через весь диапазон без повторения? В идеале число, которое я выбираю, должно было бы как бы прыгать по множеству, так что было бы неочевидно, что существует шаблон, но я не уверен, насколько это возможно.
В качестве альтернативы мог бы работать алгоритм хеширования, который гарантировал бы уникальность для значений 0-64 миллиона, но я слишком тупой, чтобы знать, возможно ли это.