Уникальный код стиля Tinyurl: потенциальный алгоритм предотвращения конфликтов

У меня есть система, для которой требуется уникальный 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 миллионов, будет работать, но я слишком глуп, чтобы узнать, возможно ли это.

Ответ 1

Все, что вам нужно, это число, которое не имеет факторов с вашим ключевым пространством. Самое простое значение - использовать простое число. Вы можете использовать Google для больших простых чисел или использовать http://primes.utm.edu/lists/small/10000.txt

Ответ 2

Любое простое число, не являющееся фактором длины последовательности, должно иметь возможность охватывать последовательность без повторения. Для 64000000 это означает, что вы не должны использовать 2 или 5. Конечно, если вы не хотите, чтобы их генерировали последовательно, генерирование их на 2 или 5 раз, вероятно, тоже не очень хорошо. Мне лично нравится номер 73973!

Ответ 3

Существует другой метод получения аналогичного результата (перескакивание по всему набору значений без повторения, без необходимости) без использования простых чисел - с помощью последовательности максимальной длины, которые вы можете создавать с использованием специально созданных сдвиговых регистров.

Ответ 4

Моя математика немного ржавая, но я думаю, вам просто нужно убедиться, что GCF из N и 64 миллиона - это 1. Я бы пошел с простым числом (которое равномерно не делит на 64 миллиона) дело.

Ответ 5

@Ник Льюис:

Ну, только если простое число не делит 64 миллиона. Таким образом, для целей опроса числа, например, 2 или 5, вероятно, не будут целесообразными.