在PHP中生成随机代码?

时间:2010-12-31 15:51:53

标签: php random

我知道这可能看起来很傻,但我想生成一个8个characetrs的随机代码,只使用php的数字或字母。我需要这个为每个注册的用户生成一个密码,谢谢

8 个答案:

答案 0 :(得分:14)

我宁愿使用md5来生成密码

但如果您想要自定义,则可以使用此类内容:

function createRandomPassword() { 

    $chars = "abcdefghijkmnopqrstuvwxyz023456789"; 
    srand((double)microtime()*1000000); 
    $i = 0; 
    $pass = '' ; 

    while ($i <= 7) { 
        $num = rand() % 33; 
        $tmp = substr($chars, $num, 1); 
        $pass = $pass . $tmp; 
        $i++; 
    } 

    return $pass; 

} 

答案 1 :(得分:7)

为了方便起见,这样的事情呢?

$pass = substr(md5(uniqid(mt_rand(), true)) , 0, 8);

答案 2 :(得分:3)

<?php 

$uniqid = uniqid();

$rand_start = rand(1,5);

$rand_8_char = substr($uniqid,$rand_start,8);

?>

答案 3 :(得分:2)

一种好的或有效的方法是:

public function generateRandomString($length = 8) {
    $characters = '0123456789abcdefghijklmnopqrs092u3tuvwxyzaskdhfhf9882323ABCDEFGHIJKLMNksadf9044OPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

通过更改$ length变量,您可以根据需要生成字母数字代码。

答案 4 :(得分:1)

使用base64_encode(),输入一些rand()个数字,然后剪下前8个字符,这些字符绝对是字母或数字。由于输入只是整数,因此这不是一个完全随机的组合。但它对于默认用户密码来说已经足够了。 (在编码之前,请通过rand()使用chr()。)

答案 5 :(得分:1)

PHP具有rand功能(以及文档声称更快的mt_rand功能。)

所以做这样的事情:

$i = 0;
$pwd = "";
while ( $i < 10) {
    if (mt_rand() % 2 == 0) {
        $pwd .= rand();
    } else {
        $pwd .= char(rand());
        // http://php.net/manual/en/function.chr.php
    }
    $i += 1;
}

答案 6 :(得分:1)

此功能就像魅力一样,您可以选择将生成的字符类型,例如:
“大写”,“小写”,“数字”,“特殊字符”

function create_random_code($length = 8, $IN_Params = [])
{
    $IN_Params['Upper_Case']        = isset($IN_Params['Upper_Case']) ? $IN_Params['Upper_Case'] : true;
    $IN_Params['Lower_Case']        = isset($IN_Params['Lower_Case']) ? $IN_Params['Lower_Case'] : true;
    $IN_Params['Number']            = isset($IN_Params['Number']) ? $IN_Params['Number'] : true;
    $IN_Params['Special_Character'] = isset($IN_Params['Special_Character']) ? $IN_Params['Special_Character'] : false;

    $chars = '';
    if ($IN_Params['Lower_Case']) {
        $chars .= "abcdefghijklmnopqrstuvwxyz";
    }

    if ($IN_Params['Upper_Case']) {
        $chars .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    }

    if ($IN_Params['Number']) {
        $chars .= "0123456789";
    }

    if ($IN_Params['Special_Character']) {
        $chars .= "!@#$%^&*()_-=+;:,.";
    }

    return substr(str_shuffle($chars), 0, $length);
}

要使用它:

echo create_random_code(
    6,
    [
        'Upper_Case'        => true,
        'Lower_Case'        => true,
        'Number'            => true,
        'Special_Character' => false
    ]
);

答案 7 :(得分:0)

出于您的目的,您可以使用以下代码生成随机代码:

bin2hex(random_bytes(10))

请注意,这里我们使用random_bytes,它是PHP 7中引入的,并使用了密码随机生成器,如果您希望难以猜测随机代码,那么这很重要。 random_int也已在PHP 7中引入,并且同样使用了密码随机生成器。

许多其他用于随机值生成的解决方案,包括涉及time()microtime()uniqid()rand()mt_rand()str_shuffle()的解决方案,和array_rand(),如果随机字符串将用作密码,承载凭证,随机数,会话标识符,“验证码”或“确认码”或其他机密值,则更容易预测且不合适

上面的代码生成20个十六进制字符(0到9,或A到F)的字符串。如果您想使用更大的字符集(例如所有大写字母,所有小写字母和10位数字),则此过程比较复杂,但是您必须使用random_int而不是{ {1}},rand()mt_rand()等,如果该字符串将用作密码,“确认代码”或其他秘密值。参见answer to a related question

在生成唯一标识符(尤其是随机标识符)时,我还会列出other things to keep in mind