16 ответов:
$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или из GUIDs):<?php $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $result = ''; for ($i = 0; $i < 5; $i++) $result .= $characters[mt_rand(0, 61)]; ?>EDIT:
Если вы беспокоитесь о безопасности, действительно, делать не использоватьrand()илиmt_rand(), и убедитесь, что ваше случайное устройство данных на самом деле является устройством, генерирующим случайные данных, а не обычный файл или что-то предсказуемое, как/dev/zero.mt_rand()считается harmful:
https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-phpEDIT: Если у вас есть поддержка 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);
Я всегда использую одну и ту же функцию для этого, как правило, для генерации паролей. Он прост в использовании и полезен.
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);
$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
Я также не знал, как это сделать, пока я не подумал об использовании PHP
array'ы. И я уверен, что это самый простой способ генерировать случайную строку или число с массива. Код: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"
если это нормально, что вы получите только буквы A-F, то вот мое решение:
str_pad(dechex(mt_rand(0, 0xFFFFF)), 5, '0', STR_PAD_LEFT);Я считаю, что использование хэш-функций является излишним для такой простой задачи, как создание последовательности случайных шестнадцатеричных цифр.
dechex+mt_randбудет делать ту же работу, но без лишних криптографической работы.str_padгарантирует 5-символьную длину выходной строки (если случайное число меньше 0x10000).вероятность дублирования зависит от
mt_rand' s надежность. Вихрь Мерсена известен высококачественной случайностью, поэтому он должен хорошо соответствовать задаче.
аналогично Брэд Кристи'ы ответ, но с помощью
sha1alrorithm для символов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)]; }**обновление **
как Archimedix указано, что это не гарантирует возврата "наименьшей возможности дублирования", поскольку количество комбинаций является низким для данного диапазона символов. Вы нужно будет либо увеличить количество символов, либо разрешить дополнительные (специальные) символы в строке. Первое решение было бы предпочтительнее, я думаю, в вашем случае.
работает в 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;
источник: 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));новый PHP
password_hash()(* >= PHP 5.5) функция делает работу для генерации прилично длинного набора прописных и строчных символов и чисел.два concat. строки до и после
password_hashв пределах $ случайная функция подходит для изменения.Paramteres для
$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; }
Comments