Php сгенерировать уникальное значение

Php сгенерировать уникальное значение

Существует отдельная функция, которая так и переводится «уникальный id/ид «

uniqid НО! Внимание! в спецификации к данной функции написано(вероятность ничтожна, но это написано в учебнике. ):

Эта функция не гарантирует получения уникального значения. Большинство операционных систем синхронизирует время с NTP, либо его аналогами, так что системное время постоянно меняется. Следовательно возможна ситуация, когда эта функция вернёт неуникальный идентификатор для процесса/потока. Для увеличения вероятности получения уникального значения используйте параметр more_entropy.

uniqid

Давайте попробуем вывести, что нам вернет функция «uniqid», для того, чтобы вывести уникальный id/ид с помощью «uniqid» нам потребуется.

И выведем вот таким образом :

И разместим данный код прямо здесь:

Как видим, что функция uniqid(); вернула:

Функция «uniqid» вернула значение из 13 знаков.

uniqid true

Как мы уже видели в предупреждении. что нужно добавить энтропии — давайте сделаем это!

В данном случае выводим вот таким образом:

И вывод данного варианта «uniqid»:

Как видим, что функция uniqid(», true); вернула:

Функция «uniqid» вернула значение из 23 знака.

Реальный уникальный id/ид из uniqid.

Как я уже цитировал выше учебник, что функция «uniqid» не дает 100% вероятности возвращения уникального id/ид .

Парадоксально! Но факт! Функция, которая должна давать уникальный id/ид — его не дает! смайлы

Ну что же. мы можем немного модифицировать функцию «uniqid», мы к ней. можем добавить. ну например функцию «mt_rand()»:

Нам вернулось рандомное число.

Присоединим функцию uniqid(true) + mt_rand()

uniqid(», true) вернет рандомное число с точкой:

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

Уникальный id/ид из microtime.

Вариант создания уникального id/ид ! Его можно создать из функции microtime.

Какая вероятность не уникальности данного id/ид?

Предположить, что совпадут «микросекунды» — это. наверное. можно сравнить с чудом.

Для этого нам понадобится функция microtime().

Выведем её с помощью echo:

Также поступим. с данной функцией. добавим str_replace? заменим точку и пробел на «ничего»:

Проверка работы функции для создания уникального id/ид .

Для создания такого уникального id/ид надо знать:

Функция microtime() возвращает текущую метку времени Unix с микросекундами. Эта функция доступна только на операционных системах, в которых есть системный вызов gettimeofday().

Поэтому. проверяем. работает ли на вашем сайте либо функцию microtime, либо gettimeofday():

Уникальный id/ид из емайла.

Выше приведенный примеры создания уникального id/ид хороши по своему!

Но у них есть один большой недостаток — они не могут гарантировать 100% уникальность .

Эти уникальные идентификаторы не привязаны никак к пользователю!

А если требуется такой, что делать?

Что есть уникального у пользователя?

Какой параметр у пользователя будет всегда уникальный?

И сделать уникальный id/ид из емайла. опять берем md5

Результат создания уникального id/ид из емайла:

Уникальный id/ид из страницы.

Для того, чтобы создать уникальный id/ид из страницы нам понадобится php — не будем же мы вручную это делать.

Получим часть адресной строки после домена с помощью

parse_url, чтобы всякая дрянь после «.html» нам не попалась.

Не буду заново пересказывать выше приведенную ссылку на страницу. сразу напишем код:

Выведем уникальный id/ид из адреса страницы:

Несколько вариантов создания уникального id/ид .

Я рассмотрел несколько вариантов создания уникального id/ид на сайте!

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

Источник

Генерация уникального ID на PHP

Генерация уникального ID на PHP

Очень часто при разработке сайтов требуется генерировать уникальный ID на PHP. Приведу пример, с которым я столкнулся в своей практике. Я занимался Интернет-магазином, и там были 2 типа товаров, которые настолько разные по своей природе, что отправлять заказы в одну таблицу было крайне неразумно. Но если я размещаю заказы по 2-м таблицам, то ID каждого заказа не является уникальным. Ведь может быть 10-й заказ в первой таблице и 10-й заказ во второй таблице. И как их различать? Вот эту проблему я и решил. А как, Вы узнаете из этой статьи.

Я добавил в каждую таблицу по одному полю key, в которое поместил уникальное значение, зависящее от текущего времени, которое, как известно, не стоит на месте (если, конечно, сервер не движется со скоростью света). Вот так это выглядело:

$key = md5(microtime(true)); // MD5-хэш текущего времени с точностью до сотых секунды
?>

И затем этот key я записывал в таблицу с заказом. И затем идентифицировал заказ не по его ID, а именно по ключу, который был уникальным для каждого заказа.

Вроде всё хорошо, однако, не так давно я нашёл прекрасную функцию, которая называется uniqid(), которая позволяет ещё лучше уникализировать ID.

$id_1 = uniqid(); //508e12465f75b
$id_2 = uniqid(«pref_»); //pref_508e12465f7bb
$id_3 = uniqid(«pref_», true); //pref_508e12465f7c15.02077905
?>

Вариант без параметров аналогичен моему варианту, только он более короткий (и в плане кода, и в плане результата). А теперь описание параметров:

  • prefix (по умолчанию, пустая строка) — некий набор символов, который будет соединяться с уникальным ID. Это очень полезно, если Вы хотите действительно высокую уникальность, чтобы данная функция не совпала результатом, например, с каким-нибудь другим сайтом. Главное, придумать префикс поуникальнее.
  • more_entropy (по умолчанию, false) — если стоит true, то в значение ID будет добавлена дополнительная энтропия. Тем самым, результат будет ещё более уникальным.

Вот так легко генерируется уникальный ID на PHP. Вы можете использовать мой способ, а можете использовать функцию uniqid(). Если использовать просто uniqid() без параметров или только с префиксом, то скорость генерации выше в 1.5-2 раза (в абсолютном значении — это мизер, но всё-таки). А если с энтропией, то без разницы. Лично я перейду на uniqid(), всё-таки гарантировать, что не будет 2-х заказов в одну сотую секунды, не стоит. А вот скорость генерации уникального ID выше, меньше кода, да и сам ID компактнее.

Создано 29.10.2012 09:47:54

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

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

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 1 ):

    Хм, не знал про данную функцию, надо будет поюзать.

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    uniqid

    Получает уникальный идентификатор с префиксом, основанный на текущем времени в микросекундах.

    Эта функция не создает ни случайную ни трудно подбираемую строку. Нельзя использовать эту функцию в целях повышения безопасности. Используйте криптографически безопасные функции/генераторы случайных данных, и криптографически защищенные хэш-функции для создания непредсказуемых безопасных ID.

    Список параметров

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

    С пустым параметром prefix , возвращаемая строка будет длиной в 13 символов. Если параметр more_entropy равен TRUE , то строка буде длиной в 23 символа.

    Если равен TRUE , то функция uniqid() добавит дополнительную энтропию (используя комбинированный линейный конгруэнтный генератор) в конце возвращаемого значения, что увеличивает вероятность уникальности результата.

    Возвращаемые значения

    Возвращает уникальный идентификатор в виде строки (string).

    Примеры

    Пример #1 Пример использования uniqid()

    /* Уникальный id, например: 4b3403665fea6 */
    printf ( «uniqid(): %s\r\n» , uniqid ());

    /* Префикс к уникальному id можно добавить одним
    * из следующих способов:
    *
    * $uniqid = $prefix . uniqid();
    * $uniqid = uniqid($prefix);
    */
    printf ( «uniqid(‘php_’): %s\r\n» , uniqid ( ‘php_’ ));

    /* Также можно активировать параметр большей энтропии, который
    * требуется на некоторых системах, таких как Cygwin. Таким образом
    * функция uniqid() сгенерирует значение: 4b340550242239.64159797
    */
    printf ( «uniqid(», true): %s\r\n» , uniqid ( » , true ));
    ?>

    Примечания

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

    Замечание:

    В Cygwin, параметр more_entropy должен быть задан как TRUE для работы этой функции.

    Источник

    PHP uniqid() Function

    The uniqid() function generates a unique ID based on the microtime (the current time in microseconds).

    Syntax

    Parameter Values

    Parameter Description
    prefix Optional. Specifies a prefix to the unique ID (useful if two scripts generate ids at exactly the same microsecond)
    more_entropy Optional. Specifies more entropy at the end of the return value. This will make the result more unique. When set to TRUE, the return string will be 23 characters. Default is FALSE, and the return string will be 13 characters long

    Technical Details

    Return Value: Returns the unique identifier, as a string
    PHP Version: 4+
    Changelog: The prefix parameter became optional in PHP 5.0.
    The limit of 114 characters long for prefix was raised in PHP 4.3.1.

    ❮ PHP Misc Reference

    Unlock Full Access 50% off

    COLOR PICKER

    colorpicker

    Join our Bootcamp!

    Report Error

    If you want to report an error, or if you want to make a suggestion, do not hesitate to send us an e-mail:

    Thank You For Helping Us!

    Your message has been sent to W3Schools.

    Top Tutorials
    Top References
    Top Examples
    Get Certified

    W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

    Источник

    Читайте также:  border-style
    Оцените статью