生成随机的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/zero
。 mt_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"