Intereting Posts
Есть ли способ определить, достигает ли адрес электронной почты своего адресата? PHP strtotime: Получить предыдущий месяц Добавьте символ FNC1 в код, созданный с помощью tcpdf datamatrix Элементы CakePHP не обновляют таблицу Генератор скелета Phpunit не может найти класс extends Как получить идентификатор строки при нажатии кнопки? Перенаправление на диалог проверки подлинности – «Произошла ошибка. Пожалуйста, повторите попытку позже" автоматически заполнять список с помощью ajax mysql и javascript Строка POST и ответ в JSONArray PHP cookie имеет одну задержку обновления Получение ошибки «Авторизованный токен от поставщика услуг не соответствует предоставленным сведениям о токенах запроса» в трехзначной аутентификации в google api В чем разница между escapeshellarg и escapeshellcmd? Относительные пространства имен и call_user_func () Доступ к контейнеру Symfony 2 через модульный тест? Проверьте, существует ли значение перед вставкой в ​​MySQL DB в скрипте PHP

PHP: Как создать случайную, уникальную буквенно-цифровую строку?

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

Как я могу создать один из тех, кто использует PHP?

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

    Уведомление о безопасности . Это решение не должно использоваться в ситуациях, когда качество вашей случайности может повлиять на безопасность приложения. В частности, rand() и uniqid() не являются криптографически защищенными генераторами случайных чисел . См . Ответ Скотта для безопасной альтернативы.

    Если вам не нужно, чтобы он был абсолютно уникален с течением времени:

    md5(uniqid(rand(), true))

    В противном случае (если вы уже определили уникальный логин для своего пользователя):

     md5(uniqid($your_user_login, true)) 

    Я просто искал, как решить эту проблему, но также хочу, чтобы моя функция создала токен, который также можно использовать для поиска пароля. Это означает, что мне нужно ограничить способность маркера быть угаданным. Поскольку uniqid основан на времени, и согласно php.net «возвращаемое значение мало отличается от microtime ()», uniqid не соответствует критериям. PHP рекомендует использовать openssl_random_pseudo_bytes() вместо этого для генерации криптографически защищенных токенов.

    Быстрый, короткий и точный ответ:

     bin2hex(openssl_random_pseudo_bytes($bytes)) 

    который будет генерировать случайную строку буквенно-цифровых символов длиной = $ bytes * 2. К сожалению, это только имеет алфавит [af][0-9] , но он работает.


    Ниже приведена самая сильная функция, которую я мог бы сделать, которая удовлетворяет критериям (это реализованная версия ответа Эрика).

     function crypto_rand_secure($min, $max) { $range = $max - $min; if ($range < 1) return $min; // not so random... $log = ceil(log($range, 2)); $bytes = (int) ($log / 8) + 1; // length in bytes $bits = (int) $log + 1; // length in bits $filter = (int) (1 << $bits) - 1; // set all lower bits to 1 do { $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes))); $rnd = $rnd & $filter; // discard irrelevant bits } while ($rnd > $range); return $min + $rnd; } function getToken($length) { $token = ""; $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz"; $codeAlphabet.= "0123456789"; $max = strlen($codeAlphabet); // edited for ($i=0; $i < $length; $i++) { $token .= $codeAlphabet[crypto_rand_secure(0, $max-1)]; } return $token; } 

    crypto_rand_secure($min, $max) работает как замена в случае замены rand() или mt_rand . Он использует openssl_random_pseudo_bytes, чтобы создать случайное число между $ min и $ max.

    getToken($length) создает алфавит для использования в токене, а затем создает строку длиной $length .

    EDIT: я пренебрег ссылкой на источник – http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322

    EDIT (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

    Пример:

     function getToken($length){ $token = ""; $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz"; $codeAlphabet.= "0123456789"; $max = strlen($codeAlphabet); // edited for ($i=0; $i < $length; $i++) { $token .= $codeAlphabet[random_int(0, $max-1)]; } return $token; } 

    Объектно-ориентированная версия самого пересмотренного решения

    Я создал объектно-ориентированное решение, основанное на ответе Скотта :

     <?php namespace Utils; /** * Class RandomStringGenerator * @package Utils * * Solution taken from here: * http://stackoverflow.com/a/13733588/1056679 */ class RandomStringGenerator { /** @var string */ protected $alphabet; /** @var int */ protected $alphabetLength; /** * @param string $alphabet */ public function __construct($alphabet = '') { if ('' !== $alphabet) { $this->setAlphabet($alphabet); } else { $this->setAlphabet( implode(range('a', 'z')) . implode(range('A', 'Z')) . implode(range(0, 9)) ); } } /** * @param string $alphabet */ public function setAlphabet($alphabet) { $this->alphabet = $alphabet; $this->alphabetLength = strlen($alphabet); } /** * @param int $length * @return string */ public function generate($length) { $token = ''; for ($i = 0; $i < $length; $i++) { $randomKey = $this->getRandomInteger(0, $this->alphabetLength); $token .= $this->alphabet[$randomKey]; } return $token; } /** * @param int $min * @param int $max * @return int */ protected function getRandomInteger($min, $max) { $range = ($max - $min); if ($range < 0) { // Not so random... return $min; } $log = log($range, 2); // Length in bytes. $bytes = (int) ($log / 8) + 1; // Length in bits. $bits = (int) $log + 1; // Set all lower bits to 1. $filter = (int) (1 << $bits) - 1; do { $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes))); // Discard irrelevant bits. $rnd = $rnd & $filter; } while ($rnd >= $range); return ($min + $rnd); } } 

    Применение

     <?php use Utils\RandomStringGenerator; // Create new instance of generator class. $generator = new RandomStringGenerator; // Set token length. $tokenLength = 32; // Call method to generate random string. $token = $generator->generate($tokenLength); 

    Пользовательский алфавит

    При необходимости вы можете использовать произвольный алфавит. Просто передайте строку с поддерживаемыми символами конструктору или сеттеру:

     <?php $customAlphabet = '0123456789ABCDEF'; // Set initial alphabet. $generator = new RandomStringGenerator($customAlphabet); // Change alphabet whenever needed. $generator->setAlphabet($customAlphabet); 

    Вот выходные образцы

     SRniGU2sRQb2K1ylXKnWwZr4HrtdRgrM q1sRUjNq1K9rG905aneFzyD5IcqD4dlC I0euIWffrURLKCCJZ5PQFcNUCto6cQfD AKwPJMEM5ytgJyJyGqoD5FQwxv82YvMr duoRF6gAawNOEQRICnOUNYmStWmOpEgS sdHUkEn4565AJoTtkc8EqJ6cC4MLEHUx eVywMdYXczuZmHaJ50nIVQjOidEVkVna baJGt7cdLDbIxMctLsEBWgAw5BByP5V0 iqT0B2obq3oerbeXkDVLjZrrLheW4d8f OUQYCny6tj2TYDlTuu1KsnUyaLkeObwa 

    Надеюсь, это поможет кому-то. Ура!

    Эта функция генерирует случайный ключ, используя цифры и буквы:

     function random_string($length) { $key = ''; $keys = array_merge(range(0, 9), range('a', 'z')); for ($i = 0; $i < $length; $i++) { $key .= $keys[array_rand($keys)]; } return $key; } echo random_string(50); 

    Пример вывода:

     zsd16xzv3jsytnp87tk7ygv73k8zmr0ekh6ly7mxaeyeh46oe8 

    Вы можете использовать UUID (универсальный уникальный идентификатор), он может использоваться для любых целей: от строки аутентификации пользователя до идентификатора транзакции транзакции.

    UUID – это 16-октетный (128-разрядный) номер. В своей канонической форме UUID представлен 32 шестнадцатеричными цифрами, отображаемыми в пяти группах, разделенных дефисом, в форме 8-4-4-4-12 для всего 36 символов (32 буквенно-цифровых символа и четыре дефиса).

     function generate_uuid() { return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0x0C2f ) | 0x4000, mt_rand( 0, 0x3fff ) | 0x8000, mt_rand( 0, 0x2Aff ), mt_rand( 0, 0xffD3 ), mt_rand( 0, 0xff4B ) ); } 

    // вызов funtion

     $transationID = generate_uuid(); 

    некоторые примерные выходы будут такими:

     E302D66D-87E3-4450-8CB6-17531895BF14 22D288BC-7289-442B-BEEA-286777D559F2 51B4DE29-3B71-4FD2-9E6C-071703E1FF31 3777C8C6-9FF5-4C78-AAA2-08A47F555E81 54B91C72-2CF4-4501-A6E9-02A60DCBAE4C 60F75C7C-1AE3-417B-82C8-14D456542CD7 8DE0168D-01D3-4502-9E59-10D665CEBCB2 

    надеюсь, что это поможет кому-то в будущем 🙂

    Я использую этот однострочный слой:

     base64_encode(openssl_random_pseudo_bytes(3 * ($length >> 2))); 

    где length – длина искомой строки (делится на 4, в противном случае округляется до ближайшего числа, делящегося на 4)

    Я опаздываю, но я здесь с хорошими исследовательскими данными, основанными на функциях, предоставленных ответом Скотта . Поэтому я создал капельку Digital Ocean только для этого 5-дневного автоматизированного теста и сохранил созданные уникальные строки в базе данных MySQL.

    В течение этого периода тестирования я использовал 5 различных длин (5, 10, 15, 20, 50) и +/- 0,5 миллиона записей для каждой длины. Во время моего теста только длина 5 генерировала +/- 3K дубликатов из 0,5 миллиона, а оставшиеся длины не генерировали дубликатов. Таким образом, мы можем сказать, что если мы будем использовать длину 15 или выше с функциями Скотта, тогда мы сможем создать высоконадежные уникальные строки. Вот таблица, показывающая мои данные исследования:

    введите описание изображения здесь

    Надеюсь, это поможет.

    1. Создайте случайное число, используя ваш любимый генератор случайных чисел
    2. Умножьте и разделите его, чтобы получить число, соответствующее количеству символов в вашем кодовом алфавите
    3. Получите элемент по этому индексу в вашем кодовом алфавите.
    4. Повторите с 1) до тех пор, пока у вас не будет требуемой длины

    например (в псевдокоде)

     int myInt = random(0, numcharacters) char[] codealphabet = 'ABCDEF12345' char random = codealphabet[i] repeat until long enough 

    Вот вам уникальный уникальный генератор идентификаторов. сделано мной.

     <?php $d=date ("d"); $m=date ("m"); $y=date ("Y"); $t=time(); $dmt=$d+$m+$y+$t; $ran= rand(0,10000000); $dmtran= $dmt+$ran; $un= uniqid(); $dmtun = $dmt.$un; $mdun = md5($dmtran.$un); $sort=substr($mdun, 16); // if you want sort length code. echo $mdun; ?> 

    вы можете повторить любой «var» для своего идентификатора, как вам нравится. но $ mdun лучше, вы можете заменить md5 на sha1 для лучшего кода, но это будет очень долго, что вам может и не понадобиться.

    Спасибо.

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

     $randomNum=substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyz"), 0, 11); or we can use custom function to generate the random number function randomNumber($length){ $numbers = range(0,9); shuffle($numbers); for($i = 0;$i < $length;$i++) $digits .= $numbers[$i]; return $digits; } //generate random number $randomNum=randomNumber(11); 
     function random_string($length = 8) { $alphabets = range('A','Z'); $numbers = range('0','9'); $additional_characters = array('_','='); $final_array = array_merge($alphabets,$numbers,$additional_characters); while($length--) { $key = array_rand($final_array); $password .= $final_array[$key]; } if (preg_match('/[A-Za-z]/', $password) && preg_match('/[0-9]/', $password)) { return $password; }else{ return random_string(); } } 

    Вот что я использую:

     md5(time() . rand()); // Creates something like 0c947c3b1047334f5bb8a3b7adc1d97b 

    Мне нравится использовать хеш-ключи при работе с проверкой ссылок. Я бы рекомендовал использовать microtime и хэширование, используя MD5, так как не должно быть причин, по которым ключи должны быть одинаковыми, поскольку хеши от микропроцесса.

    1. $key = md5(rand());
    2. $key = md5(microtime());

    Скотт, да, вы очень хорошо пишете и хорошо решаете! Благодарю.

    Мне также требуется генерировать уникальный токен API для каждого пользователя. Ниже приведен мой подход, я использовал информацию о пользователе (Userid и Username):

     public function generateUniqueToken($userid, $username){ $rand = mt_rand(100,999); $md5 = md5($userid.'!(&^ 532567_465 ///'.$username); $md53 = substr($md5,0,3); $md5_remaining = substr($md5,3); $md5 = $md53. $rand. $userid. $md5_remaining; return $md5; } 

    Пожалуйста, посмотрите и дайте мне знать, если я могу улучшить какое-либо улучшение. благодаря

    после прочтения предыдущих примеров я придумал следующее:

     protected static $nonce_length = 32; public static function getNonce() { $chars = array(); for ($i = 0; $i < 10; $i++) $chars = array_merge($chars, range(0, 9), range('A', 'Z')); shuffle($chars); $start = mt_rand(0, count($chars) - self::$nonce_length); return substr(join('', $chars), $start, self::$nonce_length); } 

    Я дублирую в 10 раз массив [0-9, AZ] и перемешиваю элементы, после того как я получу случайную начальную точку для того, чтобы substr () был более «креативным» ðŸ™‚ вы можете добавить [az] и другие элементы в массив, дублировать более или менее, быть более творческим, чем я

    Я думаю, что это лучший способ использования.

     str_shuffle(md5(rand(0,100000))) 
     <?php function generateRandomString($length = 11) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } ?> 

    выше функция генерирует вам случайную строку длиной 11 символов.

    Я считаю, что проблема со всеми существующими идеями заключается в том, что они, вероятно, уникальны, но не однозначно уникальны (как указано в ответе Дариуша Вальчака на loletech). У меня есть решение, которое на самом деле уникально. Это требует, чтобы ваш скрипт имел какую-то память. Для меня это база данных SQL. Вы также можете просто записать в файл где-нибудь. Существуют две реализации:

    Первый метод: имеет два поля, а не 1, которые обеспечивают уникальность. Первое поле – это идентификационный номер, который не является случайным, но является уникальным (первый идентификатор равен 1, второй 2 …). Если вы используете SQL, просто определите поле ID с свойством AUTO_INCREMENT. Второе поле не является уникальным, но случайным. Это может быть сгенерировано с помощью любых других техник, о которых уже говорили люди. Идея Скотта была хорошей, но md5 удобна и, вероятно, достаточно хороша для большинства целей:

     $random_token = md5($_SERVER['HTTP_USER_AGENT'] . time()); 

    Второй метод: в основном та же идея, но изначально выбирает максимальное количество строк, которые когда-либо будут созданы. Это может быть просто очень большое количество, как триллион. Затем сделайте то же самое, сгенерируйте идентификатор, но ноль положите его так, чтобы все идентификаторы имели одинаковое количество цифр. Затем просто конкатенируйте идентификатор со случайной строкой. Это будет достаточно случайным для большинства целей, но раздел ID гарантирует, что он также уникален.

    Вот что я использую в одном из моих проектов, он отлично работает и генерирует UNIQUE RANDOM TOKEN :

     $timestampz=time(); function generateRandomString($length = 60) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } $tokenparta = generateRandomString(); $token = $timestampz*3 . $tokenparta; echo $token; 

    Обратите внимание, что я умножил временную метку на три, чтобы создать путаницу для тех, кто может задаться вопросом, как генерируется этот токен;)

    Я надеюсь, что это помогает 🙂

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

     function rand_code($len) { $min_lenght= 0; $max_lenght = 100; $bigL = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $smallL = "abcdefghijklmnopqrstuvwxyz"; $number = "0123456789"; $bigB = str_shuffle($bigL); $smallS = str_shuffle($smallL); $numberS = str_shuffle($number); $subA = substr($bigB,0,5); $subB = substr($bigB,6,5); $subC = substr($bigB,10,5); $subD = substr($smallS,0,5); $subE = substr($smallS,6,5); $subF = substr($smallS,10,5); $subG = substr($numberS,0,5); $subH = substr($numberS,6,5); $subI = substr($numberS,10,5); $RandCode1 = str_shuffle($subA.$subD.$subB.$subF.$subC.$subE); $RandCode2 = str_shuffle($RandCode1); $RandCode = $RandCode1.$RandCode2; if ($len>$min_lenght && $len<$max_lenght) { $CodeEX = substr($RandCode,0,$len); } else { $CodeEX = $RandCode; } return $CodeEX; } 

    Подробная информация о генераторе случайных кодов в PHP

    Упрощение кода Скотта выше, удалив ненужные циклы, которые сильно замедляются и не делают его более безопасным, чем вызов openssl_random_pseudo_bytes только один раз

     function crypto_rand_secure($min, $max) { $range = $max - $min; if ($range < 1) return $min; // not so random... $log = ceil(log($range, 2)); $bytes = (int) ($log / 8) + 1; // length in bytes $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes))); return $min + $rnd%$range; } function getToken($length) { return bin2hex(openssl_random_pseudo_bytes($length) }