Я недавно опубликовал этот вопрос о кодах для подарочного сертификата, который пользователи могут обменять в Интернете. Я хотел найти лучший компромисс между большим пространством клавиш, малой вероятностью и удобочитаемостью. Теперь, когда я приступил к реализации, я понимаю, что у меня есть еще одна проблема, скорее проблема алгоритмического характера.
Давайте предположим, что я использую некоторый формат кода - скажем, 10 символов от A до Z для простоты, и я начинаю генерировать ваучеры. Какой правильный алгоритм для этого?!
Мой первый подход состоит в том, чтобы пронумеровать все возможные коды от 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, но они волшебным образом устраняют все вышеуказанные головные боли. Тем не менее, мне весело думать об этом, может быть, вы тоже. Я хотел бы услышать некоторые альтернативные предложения. Что у тебя есть?
Спасибо!