Intereting Posts
Простая инициализация DataTable с помощью Ajax и PHP Как увидеть двоичное представление переменной Catch db2_prepare сгенерированное предупреждение предотвращение прямого доступа к php-странице, доступ только при перенаправлении Что такое кеш байт-кода и как его использовать в PHP? PHP Curl (с NSS), вероятно, использует SSLv3 insted TLS при подключении к https Ошибка генерации symfony2 Невозможно переопределить класс Насколько важны ограничения, такие как NOT NULL и FOREIGN KEY, если я всегда буду контролировать вход в базу данных с помощью PHP? Бассейн Гузл: ждать запросов Невозможно перенаправить после отправки формы Как эффективно реализовать модули в среде MVC и обрабатывать маршрутизацию на несколько контроллеров в одном модуле? Преобразование из запроса в ModelSearch Yii2 Каково использование символа @ в PHP? Что делает побитовый код «$ n & ($ n – 1)»? Что такое www.conf?

Создать случайную строку из 5 символов

Я хочу создать точную строку из 5 случайных символов с минимальной возможностью дублирования. Какой был бы лучший способ сделать это? Благодарю.

 $rand = substr(md5(microtime()),rand(0,26),5); 

Было бы моим лучшим предположением – если вы не ищете специальных символов, тоже:

 $seed = str_split('abcdefghijklmnopqrstuvwxyz' .'ABCDEFGHIJKLMNOPQRSTUVWXYZ' .'0123456789!@#$%^&*()'); // and any other characters shuffle($seed); // probably optional since array_is randomized; this may be redundant $rand = ''; foreach (array_rand($seed, 5) as $k) $rand .= $seed[$k]; 

пример

И для одного, основанного на часах (меньше столкновений, так как он инкрементный):

 function incrementalHash($len = 5){ $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; $base = strlen($charset); $result = ''; $now = explode(' ', microtime())[1]; while ($now >= $base){ $i = $now % $base; $result = $charset[$i] . $result; $now /= $base; } return substr($result, -5); } 

Примечание: инкрементное средство легче угадывать; Если вы используете это как соль или токен проверки, не делайте этого. Соль (сейчас) «WCWyb» означает 5 секунд с этого момента «WCWyg»)

Если for циклов недостаточно, вот что мне нравится:

 $s = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5); 

Быстрый способ – использовать самые неустойчивые символы функции uniqid .

Например:

 $rand = substr(uniqid('', true), -5); 

Нижеследующее должно обеспечить наименьшую вероятность дублирования (вы можете захотеть заменить mt_rand() лучшим источником случайных чисел, например, из /dev/*random или из GUID):

 <?php $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $result = ''; for ($i = 0; $i < 5; $i++) $result .= $characters[mt_rand(0, 61)]; ?> 

РЕДАКТИРОВАТЬ:
Если вас беспокоит безопасность, действительно, не используйте rand() или mt_rand() и убедитесь, что ваше устройство случайных данных на самом деле является устройством, генерирующим случайные данные, а не обычный файл или что-то предсказуемое, например /dev/zero . mt_rand() считается вредным:
https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php

EDIT: Если у вас есть поддержка OpenSSL в PHP, вы можете использовать openssl_random_pseudo_bytes() :

 <?php $length = 5; $randomBytes = openssl_random_pseudo_bytes($length); $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $charactersLength = strlen($characters); $result = ''; for ($i = 0; $i < $length; $i++) $result .= $characters[ord($randomBytes[$i]) % $charactersLength]; ?> 

Вы можете попробовать это просто так:

 $length = 5; $randomletter = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length); 

подробнее: http://forum.arnlweb.com/viewtopic.php?f=7&t=25

Для этого я всегда использую одну и ту же функцию, как правило, для генерации паролей. Он прост в использовании и полезен.

 function randPass($length, $strength=8) { $vowels = 'aeuy'; $consonants = 'bdghjmnpqrstvz'; if ($strength >= 1) { $consonants .= 'BDGHJLMNPQRSTVWXZ'; } if ($strength >= 2) { $vowels .= "AEUY"; } if ($strength >= 4) { $consonants .= '23456789'; } if ($strength >= 8) { $consonants .= '@#$%'; } $password = ''; $alt = time() % 2; for ($i = 0; $i < $length; $i++) { if ($alt == 1) { $password .= $consonants[(rand() % strlen($consonants))]; $alt = 0; } else { $password .= $vowels[(rand() % strlen($vowels))]; $alt = 1; } } return $password; } 

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

 $my_rand_strng = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), -5); 

Если все в порядке, вы получите только буквы AF, то вот мое решение:

 str_pad(dechex(mt_rand(0, 0xFFFFF)), 5, '0', STR_PAD_LEFT); 

Я считаю, что использование хеш-функций является излишним для такой простой задачи, как генерация последовательности случайных шестнадцатеричных цифр. dechex + dechex будет выполнять ту же работу, но без ненужной криптографической работы. str_pad гарантирует 5-символьную длину выходной строки (если случайное число меньше 0x10000).

Дублирующая вероятность зависит от надежности mt_rand . Мерсенн Твистер известен высокой случайностью, поэтому он должен хорошо подходить к задаче.

 $str = ''; $str_len = 8; for($i = 0, $i < $str_len; $i++){ //97 is ascii code for 'a' and 122 is ascii code for z $str .= chr(rand(97, 122)); } return $str 

Как и ответ Брэда Кристи , но используя sha1 alrorithm для символов 0-9a-zA-Z и префикс со случайным значением:

 $str = substr(sha1(mt_rand() . microtime()), mt_rand(0,35), 5); 

Но если вы задали определенные (разрешенные) символы:

 $validChars = array('0','1','2' /*...*/,'?','-','_','a','b','c' /*...*/); $validCharsCount = count($validChars); $str = ''; for ($i=0; $i<5; $i++) { $str .= $validChars[rand(0,$validCharsCount - 1)]; } 

** ОБНОВЛЕНИЕ **

Как отметил Архимедикс, это не гарантирует возврата «наименее возможной дублирования», поскольку количество комбинаций для данного диапазона символов невелико. Вам нужно либо увеличить количество символов, либо разрешить дополнительные (специальные) символы в строке. Я думаю, первое решение было бы предпочтительным в вашем случае.

отлично работает в PHP (php 5.4.4)

 $seed = str_split('abcdefghijklmnopqrstuvwxyz'); $rand = array_rand($seed, 5); $convert = array_map(function($n){ global $seed; return $seed[$n]; },$rand); $var = implode('',$convert); echo $var; 

Демо-версия

Я также не знал, как это сделать, пока я не подумал об использовании array PHP. И я уверен, что это самый простой способ генерации случайной строки или числа с массивом. Код:

 function randstr ($len=10, $abc="aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789") { $letters = str_split($abc); $str = ""; for ($i=0; $i<=$len; $i++) { $str .= $letters[rand(0, count($letters)-1)]; }; return $str; }; 

Вы можете использовать эту функцию следующим образом:

 randstr(20) // returns a random 20 letter string // Or like this randstr(5, abc) // returns a random 5 letter string using the letters "abc" 

Источник: функция PHP, которая генерирует случайные символы

Эта простая функция PHP работала для меня:

 function cvf_ps_generate_random_code($length=10) { $string = ''; // You can define your own characters here. $characters = "23456789ABCDEFHJKLMNPRTVWXYZabcdefghijklmnopqrstuvwxyz"; for ($p = 0; $p < $length; $p++) { $string .= $characters[mt_rand(0, strlen($characters)-1)]; } return $string; } 

Применение:

 echo cvf_ps_generate_random_code(5); 

Вот мои random 5 cents

 $random=function($a, $b) { return( substr(str_shuffle(('\\`)/|@'. password_hash(mt_rand(0,999999), PASSWORD_DEFAULT).'!*^&~(')), $a, $b) ); }; echo($random(0,5)); 

Новая функция password_hash() (*> = PHP 5.5) PHP выполняет задание для генерации прилично длинного набора прописных и строчных символов и цифр.

Два конкат. строки до и после password_hash пределах $ random function подходят для изменения.

Параметрами для $random() * ($ a, $ b) являются фактически параметры substr() . 🙂

ПРИМЕЧАНИЕ: это не должно быть функцией, это может быть и нормальная переменная .. как один неприятный сингллайнер, например:

 $random=(substr(str_shuffle(('\\`)/|@'.password_hash(mt_rand(0,999999), PASSWORD_DEFAULT).'!*^&~(')), 0, 5)); echo($random); 

Я использую это:

 <?php function fRand($len) { $str = ''; $a = "abcdefghijklmnopqrstuvwxyz0123456789"; $b = str_split($a); for ($i=1; $i <= $len ; $i++) { $str .= $b[rand(0,strlen($a)-1)]; } return $str; } ?> 

Когда вы вызываете его, задается длина строки.

 <?php echo fRand([LENGHT]); ?> 

Вы также можете изменить возможные символы в строке $a .

 function CaracteresAleatorios( $Tamanno, $Opciones) { $Opciones = empty($Opciones) ? array(0, 1, 2) : $Opciones; $Tamanno = empty($Tamanno) ? 16 : $Tamanno; $Caracteres=array("0123456789","abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ"); $Caracteres= implode("",array_intersect_key($Caracteres, array_flip($Opciones))); $CantidadCaracteres=strlen($Caracteres)-1; $CaracteresAleatorios=''; for ($k = 0; $k < $Tamanno; $k++) { $CaracteresAleatorios.=$Caracteres[rand(0, $CantidadCaracteres)]; } return $CaracteresAleatorios; }