PHP随机string生成器

我试图在PHP中创build一个随机的string,我得到这个绝对没有输出:

<?php function RandomString() { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randstring = ''; for ($i = 0; $i < 10; $i++) { $randstring = $characters[rand(0, strlen($characters))]; } return $randstring; } RandomString(); echo $randstring; 

我究竟做错了什么?

具体回答这个问题有两个问题:

  1. 当你回应时, $randstring不在范围内。
  2. 字符在循环中没有被连接在一起。

这是一个带有更正的代码片段:

 function generateRandomString($length = 10) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } 

用下面的调用输出随机string:

 // Echo the random string. // Optionally, you can give it a desired string length. echo generateRandomString(); 

请注意,这会产生可预测的随机string。 如果您想创build安全令牌, 请参阅此答案 。

注意: str_shuffle()内部使用rand() ,这不适合encryption的目的(例如生成随机密码)。 你需要一个安全的随机数发生器 。 它也不允许字符重复。

还有一种方法。

更新 (现在这产生任何string的长度):

 function generateRandomString($length = 10) { return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length); } echo generateRandomString(); // OR: generateRandomString(24) 

而已。 🙂

这个问题有很多答案,但是没有一个使用密码安全的伪随机数发生器 (CSPRNG)。

简单,安全和正确的答案是使用RandomLib,而不是重新发明轮子。

对于那些坚持发明自己的解决scheme的人来说,PHP 7.0.0将为此提供random_int() 。 如果您仍然使用PHP 5.x,则我们为random_int()编写了一个PHP 5 random_int()因此您甚至可以在升级到PHP 7之前使用新的API。

在PHP中安全地生成随机整数不是一件简单的事情。 在生产中部署本地生成的algorithm之前,应该始终与您的常驻StackExchangeencryption专家进行核对。

用一个安全的整数发生器,用CSPRNG生成一个随机的string是在公园散步。

创build一个安全的随机string

 /** * Generate a random string, using a cryptographically secure * pseudorandom number generator (random_int) * * For PHP 7, random_int is a PHP core function * For PHP 5.x, depends on https://github.com/paragonie/random_compat * * @param int $length How many characters do we want? * @param string $keyspace A string of all possible characters * to select from * @return string */ function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') { $str = ''; $max = mb_strlen($keyspace, '8bit') - 1; for ($i = 0; $i < $length; ++$i) { $str .= $keyspace[random_int(0, $max)]; } return $str; } 

用法

 $a = random_str(32); $b = random_str(8, 'abcdefghijklmnopqrstuvwxyz'); 

演示 : https ://3v4l.org/KKlc3(忽略PHP 5失败;它需要random_compat)

创build一个20字符长的hexstring:

 $string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars 

在PHP 7( random_bytes() )中:

 $string = base64_encode(random_bytes(10)); // ~14 chars // or $string = bin2hex(random_bytes(10)); // 20 chars 

@tasmaniski:你的回答对我有用。 我有同样的问题,我会build议那些谁一直在寻找相同的答案。 这里来自@ tasmaniski:

 <?php $random = substr(md5(mt_rand()), 0, 7); echo $random; ?> 

根据您的应用程序(我想生成密码),您可以使用

 $string = base64_encode(openssl_random_pseudo_bytes(30)); 

作为base64,它们可能包含=-以及请求的字符。 你可以生成一个更长的string,然后过滤并修剪它以删除它们。

openssl_random_pseudo_bytes似乎是build议在php中生成一个合适的随机数的方式。 为什么rand不使用/dev/random我不知道。

我知道这可能是比较晚的游戏,但这里是一个简单的单线程生成一个真正的随机string没有任何脚本级循环或使用openssl库。

 echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))),1,10); 

将其分解,使参数清晰

 // Character List to Pick from $chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Minimum/Maximum times to repeat character List to seed from $chrRepeatMin = 1; // Minimum times to repeat the seed string $chrRepeatMax = 10; // Maximum times to repeat the seed string // Length of Random String returned $chrRandomLength = 10; // The ONE LINE random command with the above variables. echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))),1,$chrRandomLength); 

此方法通过随机重复字符列表,然后洗牌组合的string,并返回指定的字符数。

您可以通过随机化返回的string的长度来随机化这个,用mt_rand(8, 15) $chrRandomLengthreplace$chrRandomLength (对于8到15个字符之间的随机string)。

实现此function的更好方法是:

 function RandomString($length) { $keys = array_merge(range(0,9), range('a', 'z')); $key = ""; for($i=0; $i < $length; $i++) { $key .= $keys[mt_rand(0, count($keys) - 1)]; } return $key; } echo RandomString(20); 

根据这个和这个在php7 mt_rand是更随机的。 rand函数是mt_rand的别名。

函数作用域中的$randstring与您调用它的作用域不同。 您必须将返回值分配给一个variables。

 $randstring = RandomString(); echo $randstring; 

或者直接回显返回值:

 echo RandomString(); 

另外,在你的function中,你有一个小错误。 在for循环中,您需要使用.=这样每个字符都会附加到string中。 通过使用=你将覆盖每个新的字符,而不是追加。

 $randstring .= $characters[rand(0, strlen($characters))]; 
 function generateRandomString($length = 15) { return substr(sha1(rand()), 0, $length); } 

田田!

首先,你要定义你想要使用的字母表:

 $alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $special = '~!@#$%^&*(){}[],./?'; $alphabet = $alphanum . $special; 

然后,使用openssl_random_pseudo_bytes()生成正确的随机数据:

 $len = 12; // length of password $random = openssl_random_pseudo_bytes($len); 

最后,你使用这个随机数据来创build密码。 由于$random每个字符在chr(255) chr(0)之前都可以是chr(0) ,所以代码在使用$alphabet_length对其序数值进行分割之后使用余数来确保只有字母表中的字符被选中(注意这样做会使随机性):

 $alphabet_length = strlen($alphabet); $password = ''; for ($i = 0; $i < $len; ++$i) { $password .= $alphabet[ord($random[$i]) % $alphabet_length]; } 

或者,通常更好的方法是使用RandomLib和SecurityLib :

 use SecurityLib\Strength; $factory = new RandomLib\Factory; $generator = $factory->getGenerator(new Strength(Strength::MEDIUM)); $password = $generator->generateString(12, $alphabet); 
 function rndStr($len = 64) { $randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true); $str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len); return $str; } 

简短的方法

这里有一些最短的方法来生成随机string

 <?php echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); echo substr(md5(rand()), 0, 7); echo str_shuffle(MD5(microtime())); ?> 

这一个是从adminer来源采取的:

 /** Get a random string * @return string 32 hexadecimal characters */ function rand_string() { return md5(uniqid(mt_rand(), true)); } 

Adminer ,用PHP编写的数据库pipe理工具。

一个非常快捷的方法是做类似的事情:

 substr(md5(rand()),0,10); 

这将产生一个长度为10个字符的随机string。 当然,有些人可能会说在计算方面有些沉重,但现在的处理器已经经过优化,可以非常快地运行md5或sha256algorithm。 当然,如果rand()函数返回相同的值,结果将是相同的,具有相同的几率1/32767。 如果安全的问题,那么只需将rand()更改为mt_rand()

该函数的编辑版本正常工作,只是我发现的一个问题:你用错误的字符来包围$字符,所以'字符有时是生成的随机string的一部分。

要解决此问题,请更改:

 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 

至:

 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 

这种方式只能使用被包含的字符,“字符将永远不会是生成的随机string的一部分。

另一个单行,它随机生成10个字母和数字的string。 它将创build一个带有range的数组(调整第二个参数来设置大小),在这个数组上循环,并分配一个随机的ascii-char(范围0-9或az),然后使数组爆炸以获得一个string。

 $str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9))); 

注意:只适用于PHP 5.3+

来自Laravel 5框架的助手function

 /** * Generate a "random" alpha-numeric string. * * Should not be considered sufficient for cryptography, etc. * * @param int $length * @return string */ function str_random($length = 16) { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; return substr(str_shuffle(str_repeat($pool, $length)), 0, $length); } 

我喜欢最后一个使用openssl_random_pseudo_bytes的注释,但这不是我的解决scheme,因为我仍然需要删除我不想要的字符,而且我也无法获得一个长度string。 这是我的解决scheme…

 function rndStr($len = 20) { $rnd=''; for($i=0;$i<$len;$i++) { do { $byte = openssl_random_pseudo_bytes(1); $asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10)); } while(!ctype_alnum($asc)); $rnd .= $asc; } return $rnd; } 

一条线。
对于具有一些独特性的巨大string来说很快

 function random_string($length){ return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length); } 
 function randomString() { return md5(rand(100, 200)); } 

在PHP中生成一个随机string的另一种方法是:

 function RandomString($length) { $original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z')); $original_string = implode("", $original_string); return substr(str_shuffle($original_string), 0, $length); } echo RandomString(6); 

有一个简单的代码:

 echo implode("",array_map(create_function('$s','return substr($s,mt_rand(0,strlen($s)),1);'),array_fill(0,16,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"))); 

有简单的指南:

  • 要更改string长度 ,请仅将16更改为另一个值。
  • 要从不同的字符中select,请更改string。
 function randomString($length = 5) { return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length); } 

最后我find了一个解决scheme来获得我的解决scheme的随机和独特的价值

 substr(md5(time()), 0, 12) 

时间总是返回时间戳,并且始终是唯一的。 你可以使用它与MD5,以使其更好。

 <?php /** * Creates a random string * * @param (int) $length * Length in characters * @param (array) $ranges * (optional) Array of ranges to be used * * @return * Random string */ function random_string($length, $ranges = array('0-9', 'a-z', 'A-Z')) { foreach ($ranges as $r) $s .= implode(range(array_shift($r = explode('-', $r)), $r[1])); while (strlen($s) < $length) $s .= $s; return substr(str_shuffle($s), 0, $length); } // Examples: $l = 100; echo '<b>Default:</b> ' . random_string($l) . '<br />'; echo '<b>Lower Case only:</b> ' . random_string($l, array('a-z')) . '<br />'; echo '<b>HEX only:</b> ' . random_string($l, array('0-9', 'A-F')) . '<br />'; echo '<b>BIN only:</b> ' . random_string($l, array('0-1')) . '<br />'; /* End of file */ 
 function getRandomString($length) { $salt = array_merge(range('a', 'z'), range(0, 9)); $maxIndex = count($salt) - 1; $result = ''; for ($i = 0; $i < $length; $i++) { $index = mt_rand(0, $maxIndex); $result .= $salt[$index]; } return $result } 

下面是我如何得到一个真正独特的随机密钥:

 $Length = 10; $RandomString = substr(str_shuffle(md5(time())), 0, $Length); echo $RandomString; 

您可以使用time(),因为它是一个Unix时间戳,并且与上面提到的其他随机数相比始终是唯一的。 然后,您可以生成md5sum,并从生成的MD5string中获取所需的长度。 在这种情况下,我使用了10个字符,如果我想使它更独特,我可以使用更长的string。

我希望这有帮助。

来源: 生成随机字符的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); 

以下函数生成任意长度的伪string。

 /** * Returns random string of a given length. */ function get_random_string($length) { $pull = []; while (count($pull) < $length) { $pull = array_merge($pull, range(0, 9), range('a', 'z'), range('A', 'Z')); } shuffle($pull); return substr(implode($pull), 0, $length); }