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

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

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

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

Ответы [ 27 ]

0 голосов
/ 03 мая 2018

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

  $sffledStr= str_shuffle('abscdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+');
    $uniqueString = md5(time().$sffledStr);
0 голосов
/ 28 ноября 2014

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

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

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

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

0 голосов
/ 20 мая 2017
<?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 символов.

0 голосов
/ 18 апреля 2017

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

str_shuffle(md5(rand(0,100000)))
0 голосов
/ 01 августа 2015

Вот что я использую в одном из моих проектов, он отлично работает и генерирует УНИКАЛЬНЫЙ СЛУЧАЙНЫЙ ЖЕЛЕЗ :

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

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

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

0 голосов
/ 01 июня 2016

Упрощение кода Скотта, описанного выше, путем удаления ненужных циклов, которые сильно замедляются и не делают его более безопасным, чем вызов 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)
}
0 голосов
/ 12 апреля 2016

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

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

...