生成随机的5个字符的string

我想创build确切的5个随机string,最不可能重复。 什么是最好的办法呢? 谢谢。

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

而且,对于一个基于时钟的(从增量来看碰撞更less):

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

注意:增量意味着更容易猜测; 如果您将此用作盐或validation标记,则不要。 “WCWyb”的一个盐(现在)意味着从现在开始是“WCWyg”)。

如果for循环供应不足,这是我喜欢使用的:

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

快速的方法是使用uniqid函数中最易变的字符。

例如:

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

下面应该提供最less的重复机会(你可能想用一个更好的随机数字源replacemt_rand() ,例如从/dev/*random或者GUIDs):

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

编辑:
如果您担心安全问题,请不要使用rand()mt_rand() ,并validation您的随机数据设备实际上是生成随机数据的设备,而不是常规文件或可预测的/dev/zeromt_rand()被认为是有害的:
https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php

编辑:如果你有PHP的OpenSSL支持,你可以使用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]; ?> 

我总是使用相同的function,通常是生成密码。 这很容易使用和有用的。

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

你可以试试看,就像这样:

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

更多详情: http : //forum.arnlweb.com/viewtopic.php?f = 7&t = 25

如果你只能得到字母AF,那么这是我的解决scheme:

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

我相信使用散列函数对于生成一个随机的hex数字序列这样一个简单的任务是一个矫枉过正的工作。 dechex + mt_rand会做同样的工作,但不需要不必要的encryption工作。 str_pad保证输出string的长度为5个字符(如果随机数小于0x10000)。

重复概率取决于mt_rand的可靠性。 Mersenne Twister以高质量的随机性着称,所以它应该很好地适应任务。

 $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 

类似于Brad Christie的回答,但是对于字符0-9a-zA-Z使用sha1 alrorithm并且以随机值作为前缀:

 $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指出的那样,这并不能保证返回给定字符范围的组合数低的“重复获得的最小可能性”。 您将需要增加字符的数量,或允许string中的额外(特殊)字符。 对于你的情况,我认为第一个解决办法是可取的。

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。 $ random函数中的password_hash之前和之后的string都适合更改。

$random() *($ a,$ b substr()参数实际上是substr()参数。 🙂

注意:这不需要是一个函数,它也可以是一个普通的variables,就像一个讨厌的单行棋一样,像这样:

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

当你调用它时,设置string的长度。

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

您还可以更改string$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; } 

我也不知道如何做到这一点,直到我想使用PHP array 。 我很确定这是用数组生成随机string或数字的最简单方法。 代码:

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

你可以像这样使用这个function

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