Недавно я опубликовал этот вопрос о кодах для ваучера с подарочной картой, который пользователи могут выкупить в Интернете. Я хотел найти лучший компромисс между большим пространством клавиш, низкой догадкой и удобочитаемостью человека. Теперь, когда я вхожу в реализацию, я понимаю, что у меня другая проблема, большая проблема алгоритмической задачи.
Предположим, что я принимаю некоторый формат кода - скажем, 10 символов от А до Я для простоты, и я начинаю генерировать ваучеры. Каков правильный алгоритм для этого?!
Мой первый подход состоит в том, чтобы набрать все возможные коды от 0 до 308,915,776, а затем начать генерировать случайные числа в этом диапазоне. Это, очевидно, имеет большую проблему, хотя - я должен проверить свой случайный номер на все ранее созданные коды ваучера, и если он столкнется с существующим, мне придется отказаться от кода и попробовать другое. Поскольку система накапливает больше данных, она будет замедляться. В крайнем случае, когда останется только один код, система будет почти невозможна правильно ее угадать.
Я мог бы сгенерировать все коды и перетасовать их, а затем уничтожить их по порядку. Но это означает, что я должен хранить много кодов, и на самом деле мое пространство ключей больше, чем описано мной, поэтому мы говорим о очень большом количестве данных. Так что это тоже не слишком желательно.
Таким образом, это оставляет меня с использованием кодов последовательно. Однако я не хочу угадывать коды ваучеров. Пользователь, который покупает ваучер "AAAAAAAAAY", не должен иметь хороший шанс получить еще один действительный код, если он набирает "AAAAAAAAAZ".
Я могу перетасовать свой алфавит и мои позиции, чтобы вместо
'ABCDEFGHIJKLMNOPQRSTUVWXYZ' Я использую
'LYFZTGKBNDRAPWEOXQHVJSUMIC'
и поэтому вместо позиций
9 8 7 6 5 4 3 2 1 0 позиции
1 8 0 7 5 4 3 9 2 6
Используя эту логику, учитывая код
LNWHDTECMA
следующий код будет
LNEHDTECMA
Это определенно менее угадано. Но они все еще остаются только одним символом друг от друга, и, учитывая только два из этих ваучеров, вы знаете, какая позиция увеличивается, и у вас будет 90% -ный шанс получить следующий код из 24 догадок или меньше.
Мой "побег-люк" - это все, что нужно, и идти с идентификаторами GUID. У них больше символов, чем я хотел, чтобы мои пользователи должны были вводить и содержать похожие символы, такие как I/1 и O/0, но они волшебным образом устраняют все вышеупомянутые головные боли. Тем не менее, мне весело об этом думать, может быть, вы тоже. Мне бы хотелось услышать некоторые альтернативные предложения. Что у вас есть?
Спасибо!