Генерация уникальных ключей - PullRequest
12 голосов
/ 11 сентября 2008

Я искал способ, особенно в PHP, чтобы я всегда гарантированно получал уникальный ключ.

Я сделал следующее:

strtolower(substr(crypt(time()), 0, 7));

Но я обнаружил, что время от времени я получаю дубликат ключа (редко, но достаточно часто).

Я тоже думал о том, чтобы сделать:

strtolower(substr(crypt(uniqid(rand(), true)), 0, 7));

Но, согласно веб-сайту PHP, uniqid () может, если uniqid () вызывается дважды в течение одной микросекунды, он может генерировать один и тот же ключ. Я думаю, что добавление rand (), что это было бы редко, но все же возможно.

После строк, упомянутых выше, я также удаляю такие символы, как L и O, так что это менее запутанно для пользователя. Это может быть частью причины для дубликатов, но все же необходимо.

Один из вариантов, о котором я подумал, - это создание веб-сайта, который сгенерирует ключ, сохранит его в базе данных и обеспечит его полную уникальность.

Есть еще мысли? Существуют ли какие-либо сайты, которые уже делают это, имеют какой-то API или просто возвращают ключ. Я нашел http://userident.com, но я не уверен, будут ли ключи полностью уникальными.

Это должно выполняться в фоновом режиме без какого-либо ввода пользователя.

Ответы [ 13 ]

0 голосов
/ 11 сентября 2008

Вас может заинтересовать эта статья, в которой рассматривается та же проблема: GUID являются глобально уникальными, но подстроки GUID не являются .

Цель этого алгоритма - использовать комбинацию времени и местоположения («пространственно-временных координат» для гиков относительности) в качестве ключа уникальности. Однако хронометраж не идеален, поэтому есть вероятность, что, например, два идентификатора GUID генерируются в быстрой последовательности из одной и той же машины, так близко друг к другу по времени, что временная метка будет одинаковой. Вот тут и вводится уникальность.

0 голосов
/ 11 сентября 2008

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

0 голосов
/ 11 сентября 2008

Без написания кода моя логика будет:

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

ОСТОРОЖНО!
H

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...