2012-05-23 2 views
1

Я хотел бы иметь возможность создать алгоритм, который генерирует 6-символьный код подтверждения (например, A1JU2Z), который будет уникальным для данной пары (пользователя, кода). Причина в том, что я хотел бы сохранить код в 6 символов, но с помощью обрезанного набора буквенно-цифровых символов (во избежание путаницы с 1 и I и т. Д.) Допускается только ~ 300 миллионов кодов до возникновения столкновений. Конечно, мне может не понадобиться 300 миллионов кодов, но если я это сделаю, это будет огромная боль, чтобы вернуться и исправить это.Алгоритм для создания уникального, 6-символьного кода подтверждения пользователя?

Итак, есть ли способ использовать пользователя ... сказать свое имя пользователя, к универсальным уникальным кодам, чтобы тот же самый пользователь хотел создать другой код, его гарантировали, что он уникален для них? (Это, конечно, предполагает, что один пользователь не генерирует более 300 кодов мельниц)

Спасибо!

+0

Где находится _code_ в пароле '(user, code)? – Attila

+0

@Attila - Возможно, я плохо это сформулирую, но в основном хочу иметь возможность генерировать коды с использованием имени пользователя (например) + некоторой другой последовательности. Таким образом, глобально уникальные пары (имя пользователя, код подтверждения). – Peter

+0

Я думаю, что имя пользователя + код подтверждения всегда будет более 6 символов. – djleop

ответ

0

Я думаю, вы можете использовать простой генератор паролей, как это: http://www.webtoolkit.info/php-random-password-generator.html

в сочетании с алгоритмом проверки, чтобы убедиться, что она уже не используется.

$pass=generate_password(); 
$found=find_password($pass); 
while($found){ 
    $pass=generate_password(); 
    $found=find_password($pass); 
} 
save_password($user,$code,$pass); 

generate_password() - это функция, указанная в ссылке. find_password() - это функция, которую вы должны писать для проверки уже сгенерированных кодов в базе данных. save_password() - это функция, которую вы должны записать для хранения сгенерированного кода в базе данных.

Код находится на PHP, но логика здесь. Генератор паролей в ссылке легко понять, вы можете получить 6 символов длинными, с правилами символов, которые вы хотите.

+0

Привет, я хотел бы избежать шага «убедитесь, что он еще не используется». В принципе, я хочу алгоритмический/математический способ создания уникального кода для пользователя как функции этого имени пользователя. – Peter

+0

Итак, вы ищете алгоритм Hash (md5, sha1). С 6 символами риск столкновения большой. Самый простой способ - получить 6 символов из md5 или другого результата алгоритма хеширования. – djleop

1

Если идентификатор уникален только для текущего пользователя, вы можете просто генерировать каждый символ идентификатора случайным образом. Пока пользователь не должен генерировать большое количество таких идентификаторов, у вас будет разумная вероятность не генерировать один и тот же идентификатор более одного раза (вам нужно сделать некоторую математику, чтобы получить точные числа для ожидаемой вероятности столкновения, поскольку число сгенерированных ID растет).

Если у вас не должно быть, у вас есть столкновение любой ценой, вам нужно либо сохранить все ранее сгенерированные идентификаторы, либо выполнить сравнение для нового, либо сохранить счетчик сгенерированных идентификаторов (для этого требуется схема, в которой идентификатор генерация детерминирована на основе подсчета, но также уникальна - очень простой случай будет {ID=count; ++count;})