我知道这可能看起来很傻,但我想使用php生成一个8位长的随机代码,只包含数字或字母。我需要用它为每个注册用户生成一个密码,谢谢。
我更愿意使用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;
}
md5()
的想法,你可以取代现在返回的 $pass
,改为 return substr(md5($pass), 0, 8);
。 - Patrick$chars = "abcdefghijkmnopqrstuvwxyz023456789";
$i = 0;
$token = '';
while ($i <= 7) {
$num = \random_int(0, 33);
$token .= $chars{$num};
$i++;
}
(使用CSPRNG / 纯随机PHP函数) - jens1o这样的代码是否更加简洁易懂:
$pass = substr(md5(uniqid(mt_rand(), true)) , 0, 8);
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变量,您可以根据需要生成包含字母数字的代码。
<?php
$uniqid = uniqid();
$rand_start = rand(1,5);
$rand_8_char = substr($uniqid,$rand_start,8);
?>
uniqid()
的第二个参数中添加 true,它就会为唯一值添加熵 :-) - Patrickfunction 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
]
);
rand()
一次,通过设置允许的最小和最大数字来生成密码,例如- $pwd = rand(10000000, 99999999);
- Patrickbase64_encode()
函数,将一些rand()
生成的数字输入其中,并截取前8个字符,这些字符肯定是字母或数字。由于输入只是整数,所以这不是完全随机的组合。但对于默认用户密码来说已经足够了。(否则在编码之前使用chr()
通过rand()
生成字符。)对于您的目的,您可以使用以下内容生成随机代码:
bin2hex(random_bytes(10))
random_bytes
,它是在PHP 7中引入的,并使用加密随机生成器,如果您希望随机代码难以猜测,则这一点非常重要。 random_int
也是在PHP 7中引入的,同样使用加密随机生成器。time()
、microtime()
、uniqid()
、rand()
、mt_rand()
、str_shuffle()
、array_rand()
和shuffle()
的解决方案,更容易预测,并且如果随机字符串将用作密码、承载凭据、nonce、会话标识符、“验证代码”或“确认代码”或另一个秘密值,则不适合使用。random_int
而不是rand()
、mt_rand()
、str_shuffle()
等。请参见相关问题的答案。