Php 如何生成由hypen分隔的随机密钥

Php 如何生成由hypen分隔的随机密钥,php,random,yii,Php,Random,Yii,我正在做Yii。我想生成20位随机键。我写了一个函数作为- public function GenerateKey() { //for generating random confirm key $length = 20; $chars = array_merge(range(0,9), range('a','z'), range('A','Z')); shuffle($chars); $password = implode(array_slice

我正在做Yii。我想生成20位随机键。我写了一个函数作为-

public function GenerateKey()
{
    //for generating random confirm key
     $length = 20;
     $chars = array_merge(range(0,9), range('a','z'), range('A','Z'));
     shuffle($chars);
     $password = implode(array_slice($chars, 0, $length));
     return $password;
}
此函数正确生成20位密钥。但是我希望密钥的格式像
“g12a-Gh45-gjk7-nbj8-lhk8”。i、 被催眠隔开。那么我需要做什么更改呢?

您可以使用添加连字符。用于删除它添加的尾部连字符,只保留那些实际分隔组的连字符

return substr(chunk_split($password, 4, '-'), 0, 24);
但是,请注意,不仅使用,而且不允许使用同一字符两次。相反,在for循环中使用,然后使用chunk_split()很容易避免:

$password = '';
for ($i = 0; $i < $length; $i++) {
    if ( $i != 0 && $i % 4 == 0 ) { // nonzero and divisible by 4
        $password .= '-';
    }
    $password .= $chars[mt_rand(0, count($chars) - 1)];
}
return $password;
$password='';
对于($i=0;$i<$length;$i++){
如果($i!=0&&$i%4==0){//非零且可被4整除
$password.='-';
}
$password.=$chars[mt_rand(0,计数($chars)-1)];
}
返回$password;

(即使mt_rand()也不是加密安全的PRNG。如果您需要生成某些必须非常难以预测的内容(例如加密密钥或密码重置令牌),用于生成字节,然后使用一个单独的函数,例如将它们编码为可打印字符。我不熟悉Yii,因此无法说明它是否有用于此的函数。)

您可以使用此Yii内部函数:

Yii::app()->getSecurityManager()->generateRandomString($length);

你真的不想两次使用同一个字符吗?