PHP: Как создать случайную уникальную буквенно-цифровую строку? - PullRequest
336 голосов
/ 04 декабря 2009

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

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

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

Ответы [ 27 ]

3 голосов
/ 11 мая 2018

Для действительно случайных строк вы можете использовать

<?php

echo md5(microtime(true).mt_Rand());

выходы:

40a29479ec808ad4bcff288a48a25d5c

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

2 голосов
/ 27 мая 2015

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

md5(time() . rand());    
// Creates something like 0c947c3b1047334f5bb8a3b7adc1d97b
2 голосов
/ 08 января 2014
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-z0-9]/', $password))
    {
     return $password;
    }else{
    return  random_string();
    }

 }
2 голосов
/ 12 апреля 2019

При попытке создать случайный пароль вы пытаетесь:

  • Сначала создайте криптографически безопасный набор случайных байтов

  • Во-вторых, превращение этих случайных байтов в печатаемую строку

Теперь есть несколько способов генерировать случайные байты в php, например:

$length = 32;

//PHP 7+
$bytes= random_bytes($length);

//PHP < 7
$bytes= openssl_random_pseudo_bytes($length);

Затем вы хотите превратить эти случайные байты в печатную строку:

Вы можете использовать bin2hex :

$string = bin2hex($bytes);

или base64_encode :

$string = base64_encode($bytes);

Однако обратите внимание, что вы не контролируете длину строки, если используете base64. Вы можете использовать bin2hex, чтобы сделать это, используя 32 байта превратится в 64 символьную строку . Но это будет работать только в строке EVEN .

1 голос
/ 23 июля 2018

Это простая функция, которая позволяет генерировать случайные строки, содержащие буквы и цифры (буквенно-цифровые). Вы также можете ограничить длину строки. Эти случайные строки могут быть использованы для различных целей, в том числе: код реферала, промокод, код купона. Функция опирается на следующие функции PHP: base_convert, sha1, uniqid, mt_rand

function random_code($length)
{
  return substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, $length);
}

echo random_code(6);

/*sample output
* a7d9e8
* 3klo93
*/
1 голос
/ 07 марта 2016

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

  1. $key = md5(rand());
  2. $key = md5(microtime());
1 голос
/ 06 декабря 2018

Если вы хотите сгенерировать уникальную строку в PHP, попробуйте следующее.

md5(uniqid().mt_rand());

В этом

uniqid() - генерирует уникальную строку. Эта функция возвращает уникальный идентификатор на основе метки времени в виде строки.

mt_rand() - Генерация случайного числа.

md5() - Будет сгенерирована хеш-строка.

1 голос
/ 25 февраля 2015

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

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, A-Z] и перетасую элементы, после того как получаю случайную начальную точку для substr (), чтобы быть более «креативным» :) Вы можете добавить [a-z] и другие элементы в массив, дублировать более или менее, быть более креативным, чем я

0 голосов
/ 09 марта 2019

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

<?php
  function random_alphanumeric($length) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689';
    $my_string = '';
    for ($i = 0; $i < $length; $i++) {
      $pos = mt_rand(0, strlen($chars) -1);
      $my_string .= substr($chars, $pos, 1);
    }
    return $my_string;
  }
  echo random_alphanumeric(50); // 50 characters
?>

Генерирует, например: Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86g

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

$string_1 = random_alphanumeric(50);
$string_2 = random_alphanumeric(50);
while ($string_1 == $string_2) {
  $string_1 = random_alphanumeric(50);
  $string_2 = random_alphanumeric(50);
  if ($string_1 != $string_2) {
     break;
  }
}
echo $string_1;
echo "<br>\n";
echo $string_2;

генерирует две уникальные строки:

qsBDs4JOoVRfFxyLAOGECYIsWvpcpMzAO9pypwxsqPKeAmYLOi

Ti3kE1WfGgTNxQVXtbNNbhhvvapnaUfGMVJecHkUjHbuCb85pF

Надеюсь, это то, что вы ищете ...

0 голосов
/ 25 марта 2014

Скотт, да ты очень пишешь и хорошее решение! Спасибо.

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

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;
}

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

...