Как можно было бы генерировать случайную уникальную строку, используя цифры и буквы для использования в проверочной ссылке? Например, когда вы создаете учетную запись на веб-сайте, и он отправляет вам электронное письмо со ссылкой, и вам нужно щелкнуть эту ссылку, чтобы подтвердить свой аккаунт ... да ... один из них.
Как я могу создать один из тех, кто использует PHP?
Обновление: только что вспомнил uniqid()
. Это функция PHP, которая генерирует уникальный идентификатор на основе текущего времени в микросекундах. Я думаю, что я буду использовать это.
php
string
random
uniqueidentifier
Эндрю
источник
источник
Scott
правильный ответ. Скотт использует криптографически безопасный генератор псевдослучайных чисел OpenSSL (CSPRNG), который выберет наиболее безопасный источник энтропии на основе вашей платформы.uniqid
небезопасны. Используйте что-то вродеRandom::alphanumericString($length)
илиRandom::alphanumericHumanString($length)
.Ответы:
Если вам не нужно, чтобы он был абсолютно уникальным со временем:
md5(uniqid(rand(), true))
В противном случае (если вы уже определили уникальный логин для вашего пользователя):
источник
Я просто смотрел, как решить эту проблему, но я также хочу, чтобы моя функция создавала токен, который также можно использовать для получения пароля. Это означает, что мне нужно ограничить способность токена угадываться. Потому
uniqid
что основан на времени, и согласно php.net "возвращаемое значение мало отличается от microtime ()",uniqid
не соответствует критериям. PHP рекомендует использоватьopenssl_random_pseudo_bytes()
вместо этого для создания криптографически безопасных токенов.Быстрый, короткий и конкретный ответ:
который сгенерирует случайную строку буквенно-цифровых символов длиной = $ байтов * 2. К сожалению, это только алфавит
[a-f][0-9]
, но это работает.Ниже приведена самая сильная функция, которую я мог сделать, которая удовлетворяет критериям (это реализованная версия ответа Эрика).
crypto_rand_secure($min, $max)
работает как капля в заменеrand()
илиmt_rand
. Он использует openssl_random_pseudo_bytes, чтобы помочь создать случайное число между $ min и $ max.getToken($length)
создает алфавит для использования в токене, а затем создает строку длины$length
.РЕДАКТИРОВАТЬ: я не упомянул источник - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
РЕДАКТИРОВАТЬ (PHP7): С выпуском PHP7 стандартная библиотека теперь имеет две новые функции, которые могут заменить / улучшить / упростить функцию crypto_rand_secure, описанную выше.
random_bytes($length)
а такжеrandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
Пример:
источник
base64_encode
вместо,bin2hex
чтобы получить более короткую строку с большим алфавитом.Объектно-ориентированная версия решения с наибольшим количеством голосов
Я создал объектно-ориентированное решение на основе ответа Скотта :
Применение
Пользовательский алфавит
Вы можете использовать пользовательский алфавит, если требуется. Просто передайте строку с поддерживаемыми символами конструктору или установщику:
Вот выходные образцы
Надеюсь, это кому-нибудь поможет. Ура!
источник
$obj = new RandomStringGenerator;
но какой метод я должен вызвать? Спасибо.generate
метод, как в примере выше. Просто передайте ему целое число, чтобы указать длину полученной строки.Custom Alphabet
не. Я получил пустой вывод, когда я эхо. Во всяком случае, я даже не уверен, что толку во втором примере,Custom Alphabet
поэтому я думаю, что я останусь с первым примером. Спасибо.Я опоздал, но я здесь с некоторыми хорошими исследовательскими данными, основанными на функциях, предоставленных ответом Скотта . Поэтому я настроил каплю Digital Ocean только для этого 5-дневного автоматического теста и сохранил сгенерированные уникальные строки в базе данных MySQL.
В течение этого тестового периода я использовал 5 разных длин (5, 10, 15, 20, 50), и для каждой длины было вставлено +/- 0,5 миллиона записей. Во время моего теста только длина 5 генерировала дубликаты +/- 3K из 0,5 миллиона, а оставшиеся длины не генерировали дубликатов. Таким образом, мы можем сказать, что если мы используем длину 15 или выше с функциями Скотта, то мы можем генерировать высоконадежные уникальные строки. Вот таблица с моими данными исследований:
Обновление: я создал простое приложение Heroku, используя эти функции, которые возвращают токен как ответ JSON. Доступ к приложению можно получить по адресу https://uniquestrings.herokuapp.com/api/token?length=15.
Надеюсь, это поможет.
источник
Вы можете использовать UUID (универсальный уникальный идентификатор), его можно использовать для любых целей, от строки аутентификации пользователя до идентификатора платежной транзакции.
UUID - это 16-октетное (128-битное) число. В своей канонической форме UUID представлен 32 шестнадцатеричными цифрами, отображаемыми в пяти группах, разделенных дефисами, в форме 8-4-4-4-12, в общей сложности 36 символов (32 буквенно-цифровых символа и четыре дефиса).
// вызов функции
некоторые примеры выходных данных будут выглядеть так:
надеюсь, это поможет кому-то в будущем :)
источник
Эта функция сгенерирует случайный ключ, используя цифры и буквы:
Пример вывода:
источник
Я использую этот однострочник:
где длина - длина искомой строки (делится на 4, в противном случае она округляется до ближайшего числа, кратного 4)
источник
==
base64url_encode
можно использовать вместо этого, см. Здесь: php.net/manual/en/function.base64-encode.phpИспользуйте код ниже, чтобы сгенерировать случайное число из 11 символов или изменить число в соответствии с вашими требованиями.
или мы можем использовать пользовательскую функцию для генерации случайного числа
источник
substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstvwxyz', 36)), 0, 11);
например (в псевдокоде)
источник
Перед вами уникальный генератор идентификаторов. сделано мной.
Вы можете повторить любой «var» для вашего идентификатора, как вам нравится. но $ mdun лучше, вы можете заменить md5 на sha1 для лучшего кода, но это будет очень долго, что может вам не понадобиться.
Спасибо.
источник
Для действительно случайных строк вы можете использовать
выходы:
так что даже если вы попытаетесь сгенерировать строку несколько раз в одно и то же время, вы получите другой вывод.
источник
При попытке создать случайный пароль вы пытаетесь:
Сначала создайте криптографически безопасный набор случайных байтов
Во-вторых, превращение этих случайных байтов в строку для печати
Теперь есть несколько способов генерировать случайные байты в php, например:
Затем вы хотите превратить эти случайные байты в печатную строку:
Вы можете использовать bin2hex :
или base64_encode :
Однако обратите внимание, что вы не контролируете длину строки, если используете base64. Вы можете использовать bin2hex, чтобы сделать это, использование 32 байтов превратится в строку из 64 символов . Но это будет работать только так в строке EVEN .
Так что в основном вы можете просто сделать :
источник
Вот что я использую:
источник
источник
Это простая функция, которая позволяет генерировать случайные строки, содержащие буквы и цифры (буквенно-цифровые). Вы также можете ограничить длину строки. Эти случайные строки могут быть использованы для различных целей, в том числе: код реферала, промокод, код купона. Функция опирается на следующие функции PHP: base_convert, sha1, uniqid, mt_rand
источник
после прочтения предыдущих примеров я придумал это:
Я 10 раз продублирую массив [0-9, AZ] и перетасую элементы, после того как я получаю случайную начальную точку для substr (), чтобы быть более «креативной» :), вы можете добавить [az] и другие элементы в массив, дублировать более или менее, будь более креативным, чем я
источник
Мне нравится использовать хеш-ключи при работе с проверочными ссылками. Я бы порекомендовал использовать microtime и использовать хеширование с использованием MD5, поскольку не должно быть никаких причин, по которым ключи должны совпадать, поскольку хэши основаны на микротайме.
$key = md5(rand());
$key = md5(microtime());
источник
Выше функция генерирует случайную строку длиной 11 символов.
источник
Если вы хотите сгенерировать уникальную строку в PHP, попробуйте следующее.
В этом,
uniqid()
- Он будет генерировать уникальную строку. Эта функция возвращает уникальный идентификатор на основе метки времени в виде строки.mt_rand()
- Генерация случайного числа.md5()
- Он сгенерирует хеш-строку.источник
Скотт, да ты очень пишешь и хорошее решение! Спасибо.
Я также должен создать уникальный токен API для каждого моего пользователя. Вот мой подход, я использовал информацию о пользователе (Userid и Username):
Пожалуйста, посмотрите и дайте мне знать, если я смогу улучшить. Спасибо
источник
Вот что я использую в одном из своих проектов, он отлично работает и генерирует УНИКАЛЬНЫЙ СЛУЧАЙНЫЙ ЖЕЛЕЗ :
Пожалуйста, обратите внимание, что я умножил временную метку на три, чтобы создать путаницу для всех, кому может быть интересно, как генерируется этот токен;)
Я надеюсь, что это помогает :)
источник
Я думаю, что это лучший метод для использования.
источник
мы можем использовать эти две строки кода для генерации уникальной строки, проверенной около 10000000 раз итерации
источник
Я всегда использую эту функцию для генерации произвольной случайной буквенно-цифровой строки ... Надеюсь, это поможет.
Он генерирует, например: Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86g
Если вы хотите сравнить с другой строкой, чтобы убедиться, что это уникальная последовательность, вы можете использовать этот трюк ...
он генерирует две уникальные строки:
qsBDs4JOoVRfFxyLAOGECYIsWvpcpMzAO9pypwxsqPKeAmYLOi
Ti3kE1WfGgTNxQVXtbNNbhhvvapnaUfGMVJecHkUjHbuCb85pF
Надеюсь, это то, что вы ищете ...
источник
Простое решение состоит в том, чтобы преобразовать основание 64 в алфавитно-цифровую, отбрасывая не буквенно-цифровые символы.
Этот использует random_bytes () для криптографически безопасного результата.
источник
Я думаю, что это лучшее решение
источник
Я полагаю, что проблема со всеми существующими идеями заключается в том, что они, вероятно, уникальны, но не обязательно уникальны (как указано в ответе Дариуша Вальчака на loletech). У меня есть решение, которое на самом деле является уникальным. Это требует, чтобы у вашего скрипта была какая-то память. Для меня это база данных SQL. Вы также можете просто написать куда-нибудь файл. Есть две реализации:
Первый способ: иметь ДВА поля, а не 1, которые обеспечивают уникальность. Первое поле - это идентификационный номер, который не является случайным, но является уникальным (первый идентификатор - 1, второй - 2 ...). Если вы используете SQL, просто определите поле ID с помощью свойства AUTO_INCREMENT. Второе поле не уникально, но случайно. Это может быть сгенерировано с помощью любой другой техники, о которой люди уже упоминали. Идея Скотта была хорошей, но md5 удобен и, вероятно, достаточно хорош для большинства целей:
Второй метод: в основном та же идея, но изначально выбирают максимальное количество строк, которые когда-либо будут сгенерированы. Это может быть очень большое число, например, триллион. Затем сделайте то же самое, сгенерируйте идентификатор, но добавьте ноль, чтобы все идентификаторы имели одинаковое количество цифр. Затем просто объедините идентификатор со случайной строкой. Это будет достаточно случайным для большинства целей, но раздел идентификатора будет гарантировать, что он также уникален.
источник
Вы можете использовать этот код, я надеюсь, он будет вам полезен.
Подробности о генераторе случайного кода в PHP
источник
Упрощение кода Скотта, описанного выше, путем удаления ненужных циклов, которые сильно замедляются и не делают его более безопасным, чем вызов openssl_random_pseudo_bytes только один раз
источник
openssl
это не является причиной, это из-за смещения по модулю в вашем заявлении возврата. 100 (диапазон) не делит 255 (1 байт) равномерно и вызывает эти результаты. Моя самая большая проблема с вашим ответом состоит в том, что вы заявляете, что функция безопасна, как использование цикла, что неверно. Ваша реализация crypto_rand_secure не криптографически безопасна и вводит в заблуждение.openssl
более безопасным, но, что более важно, он не делает его менее безопасным, этот ответ делает. Код выше берет совершенно хорошее случайное число и искажает его, смещая его в сторону меньших чисел. Если вы добавите в свой ответ отказ от ответственности, заявив, что он быстрее (путем удаления цикла), но это не CSPRNG, это решит эту проблему. Пожалуйста, ради любви к криптографии, сообщите пользователям, что выходные данные этой функции могут быть предвзятыми и не являются эквивалентным решением. Цикл не только для того, чтобы раздражать вас.