Php 生成随机的5个字符字符串
我想创建精确的5个随机字符字符串,尽可能减少复制的可能性。最好的方法是什么?谢谢Php 生成随机的5个字符字符串,php,random,Php,Random,我想创建精确的5个随机字符字符串,尽可能减少复制的可能性。最好的方法是什么?谢谢 $rand = substr(md5(microtime()),rand(0,26),5); 这是我最好的猜测——除非你也在寻找特殊的角色: $seed = str_split('abcdefghijklmnopqrstuvwxyz' .'ABCDEFGHIJKLMNOPQRSTUVWXYZ' .'0123456789!@#$%^&*()
$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];
对于一个基于时钟的系统(因为它是增量的,所以碰撞更少):
注:增量意味着更容易猜测;如果您将此用作salt或验证令牌,请不要使用。salt(现在)的“WCWyb”表示从现在起5秒后它是“WCWyg”)我总是使用相同的函数来实现这一点,通常用于生成密码。它很容易使用和有用
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;
}
函数randPass($length,$strength=8){
$元音='aeuy';
$consonates='bdghjmnpqrstvz';
如果($strength>=1){
$辅音='BDGHJLMNPQRSTVWXZ';
}
如果($强度>=2){
$元音。=“AEUY”;
}
如果($强度>=4){
$辅音='23456789';
}
如果($强度>=8){
$consonates.='@#$%';
}
$password='';
$alt=time()%2;
对于($i=0;$i<$length;$i++){
如果($alt==1){
$password.=$consonates[(rand()%strlen($consonates))];
$alt=0;
}否则{
$password.=$voterls[(rand()%strlen($voterls))];
$alt=1;
}
}
返回$password;
}
一种快速的方法是使用函数中最不稳定的字符
例如:
$rand = substr(uniqid('', true), -5);
与的答案类似,但对字符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)];
}
$validChars=array('0'、'1'、'2'/*…*/、'?'、'-'、'u'、'a'、'b'、'c'/*…*/);
$validcharscont=计数($validChars);
$str='';
对于($i=0;$i而言,以下内容应提供最少的复制机会(您可能希望使用更好的随机数源替换mt_rand()
,例如来自/dev/*random
或来自guid):
如果for
环路供不应求,我喜欢使用以下方法:
$s = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);
如果可以只得到字母A-F,那么下面是我的解决方案:
str_pad(dechex(mt_rand(0, 0xFFFFF)), 5, '0', STR_PAD_LEFT);
我认为,对于生成随机十六进制数字序列这样一个简单的任务,使用哈希函数是一种过分的做法。dechex
+mt_rand
将完成同样的工作,但没有不必要的加密工作。stru pad
保证输出字符串的长度为5个字符(如果随机数小于0x10000)
重复概率取决于mt_rand的可靠性。它以高质量的随机性而闻名,因此它应该很适合任务。在PHP中工作良好(PHP5.4.4)
来源:
这个简单的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;
}
$str='';
$str_len=8;
对于($i=0,$i<$str_len;$i++){
//97表示“a”的ascii码,122表示“z”的ascii码
$str.=chr(兰特(97122));
}
返回$str
这是我的随机5美分
$random=function($a, $b) {
return(
substr(str_shuffle(('\\`)/|@'.
password_hash(mt_rand(0,999999),
PASSWORD_DEFAULT).'!*^&~(')),
$a, $b)
);
};
echo($random(0,5));
PHP新的password\u hash()
(*>=PHP5.5)函数用于生成相当长的大小写字符和数字集
$random函数中密码\u哈希
前后的两个concat.字符串适合更改
$random()
*($a,$b)的参数实际上是substr()
参数。:)
注意:这不需要是一个函数,它也可以是正态变量..作为一个讨厌的单线性函数,如下所示:
$random=(substr(str_shuffle(('\\`)/|@'.password_hash(mt_rand(0,999999), PASSWORD_DEFAULT).'!*^&~(')), 0, 5));
echo($random);
$length = 5;
$randomletter = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length);
我经常用这个:
<?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
中可能的字符。您可以这样简单地尝试:
$random=(substr(str_shuffle(('\\`)/|@'.password_hash(mt_rand(0,999999), PASSWORD_DEFAULT).'!*^&~(')), 0, 5));
echo($random);
$length = 5;
$randomletter = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length);
更多细节:str\u shuffle似乎是一个很好的用法。
用你想要的角色为洗牌设定种子
$my_rand_strng = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), -5);
function-CaracteresAleatorios($Tamanno,$optiones){
$Opciones=空($Opciones)?数组(0,1,2):$Opciones;
$Tamanno=空($Tamanno)?16:$Tamanno;
$Caracteres=数组(“0123456789”、“abcdefghijklmnopqrstuvxyz”、“abcdefghijklmnopqrstuvxyz”);
$Caracteres=内爆(“,数组相交键($Caracteres,数组翻转($optiones));
$cantidadcharacteres=strlen($Caracteres)-1;
$CaracteresAleatorios='';
对于($k=0;$k<$Tamanno;$k++){
$CaracteresAleatorios.=$Caracteres[rand(0,$cantidadcharacteres)];
}
返回$CaracteresAleatorios;
}
在想到使用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;
};
您是否有一个特定字符集,或者只设置了0-9a-zA-Z
?这个代码高尔夫挑战可能是一个发现:使用您可以获得具有0-9a-zA-Z的字符串,这些字符串来源于加密安全的随机数据。使用time()
比microtime()可预测性高达100万倍
。请注意我对Brad答案的评论,更大的问题是生成的哈希是由16个有效字符组成的十六进制表示,因此,$str
@Archimedix可能只剩下1024个变体,但OP没有要求安全性,问题是定义了字符串生成算法5×26个不同字符的组合,并避免重复。这可能是注册过程(或计费过程)中的确认参考号,或其他原因。据我所知,他确实要求获得重复的可能性最小,这有0.1%的概率(1/1024)但是,如果您需要生成一个5个字符的引用密钥,并将其作为客户/客户,那么您不希望将其作为“”的参数⅓
“只是因为它更安全……您将引用密钥增加到7个或更多字符
<?php echo fRand([LENGHT]); ?>
$length = 5;
$randomletter = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length);
$my_rand_strng = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), -5);
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;
}
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"