Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 生成随机的5个字符字符串_Php_Random - Fatal编程技术网

Php 生成随机的5个字符字符串

Php 生成随机的5个字符字符串,php,random,Php,Random,我想创建精确的5个随机字符字符串,尽可能减少复制的可能性。最好的方法是什么?谢谢 $rand = substr(md5(microtime()),rand(0,26),5); 这是我最好的猜测——除非你也在寻找特殊的角色: $seed = str_split('abcdefghijklmnopqrstuvwxyz' .'ABCDEFGHIJKLMNOPQRSTUVWXYZ' .'0123456789!@#$%^&*()

我想创建精确的5个随机字符字符串,尽可能减少复制的可能性。最好的方法是什么?谢谢

$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"