2009-09-08 8 views
2

Я рассматриваю с помощью этого: http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.htmlСоздание действительно уникального идентификатора заказа в PHP?

Моя идея заключается в том, чтобы использовать смесь между 2 и 3. Но мой вопрос заключается в том, что, хотя шансы невелики, есть еще шанс, что на два порядка с тем же порядка # может быть сгенерирован, если подстроить результат длиной всего 5 символов? Что насчет 3? 2? 1? Конечно, если это 1, есть вероятность 1/(26 + 10), что идентификатор будет таким же?

+0

первый пример код в публикуемой ссылке уже дерьмо: он забыл нанесенные цитаты вокруг его строки (я не думаю, что это константа) – knittl

ответ

4

Допуская ваших пользователей аутентификации и имеете идентификатор пользователя:

$unique_id = time() . mt_rand() . $userid; 

Если тот же пользователь запрашивает эту страницу второй раз за ту же секунду, все равно будет шанс 1 в mt_getrandmax(), который на моей машине возвращает 2147483647. Возможно, вы можете жить с этим?

Если ваши пользователи не прошли аутентификацию, вы можете использовать хэш своего IP-адреса, если хотите.

4

Зачем вам нужен уникальный идентификатор?

Если вы хотите создать уникальный идентификатор в своей БД, оставьте его в своей БД, используя автоматическое увеличение.

В любом случае, вы можете использовать комбинацию microtime() и rand(). Вы довольно уникальны.

Редактировать, относительно комментарии OP в:

Вы не можете иметь "всегда уникальный" если. Или, если вы найдете, как вы выиграете награду за turing.

Даже лучшие математические соображения оставляют вас со вкусом «да, но раз в 15645736536475 раз, я буду прикручен».

Только способ иметь счетчик, который вы увеличиваете каждый раз, когда вам нужен новый идентификатор. Вот как это делают DB. Зачем вам нужен идентификатор перед вставкой?

+0

Я хочу уникальный идентификатор ДО Я обязуюсь БД. И я согласен, это было бы «довольно уникально». Как я могу получить тот, который ВСЕГДА уникален, не сохраняя его в БД. – coderama

+0

Как вы думаете, что это возможно? Чтобы генерировать «всегда уникальный идентификатор», вам нужно будет не только знать все идентификаторы, которые были сгенерированы ранее, но и любой идентификатор, который будет когда-либо создан ... Удачи, выясняя, как это сделать ... – fresskoma

+2

@ x3ro : это немного преувеличение ... если вы предполагаете, что сам алгоритм не изменяется, то вы можете гарантировать уникальный идентификатор, зная * либо * все прошлые идентификаторы * или * все будущие идентификаторы. И с нашей нынешней технологией, первая легче реализовать! –

1

взят из РНР uniqid «s страницы руководства:

$better_token = md5(uniqid(mt_rand(), true)); 

, хотя это могло бы быть лучше, чтобы оставить md5 -части из (уменьшает количество маркеров до 2^128)

если ваши используя базы данных, то да, вы должны позволить вашей СУБД обрабатывать поколение идентификаторов

3

Если вы полагаетесь на случайную строку, то да, теоретически возможно, что два идентификатора будут одинаковыми. Вот почему используется длинная случайная строка, чтобы сделать такую ​​возможность настолько маловероятной, чтобы быть приемлемой. Вероятности можно вычислить: например, если идентификатор состоит из текущего времени (до ближайшей секунды) и случайной 5-значной буквенно-цифровой строки и предположим, что в течение одной секунды генерируются 3 идентификатора, тогда коэффициенты двух (или более), то же самое: 1 - (38^5!/(38^5-3)!/38^5^3) = 3,79е-8. Большинство людей согласятся с тем, что такие коэффициенты равны , а не достаточно низкими для практических приложений, поэтому страница, с которой вы связывались, предлагает вместо 10 символов.

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

+0

Я согласен с математическим подходом. IMO 1E-15 ** начать **, чтобы быть приемлемым. –

1

Вы можете использовать хеширование microtime и sha256 или без хеширования.

$generate_order_id = hash('sha256', microtime()); 
Смежные вопросы