【发布时间】:2010-12-31 15:51:52
【问题描述】:
我知道这可能看起来很傻,但我想使用 php 生成一个 8 个字符的随机代码,只有数字或字母。我需要这个来为每个注册的用户生成一个密码,谢谢
【问题讨论】:
-
你用谷歌搜索过“php 随机密码生成器” - 有很多点击...
我知道这可能看起来很傻,但我想使用 php 生成一个 8 个字符的随机代码,只有数字或字母。我需要这个来为每个注册的用户生成一个密码,谢谢
【问题讨论】:
为了方便起见,像这样的东西怎么样:
$pass = substr(md5(uniqid(mt_rand(), true)) , 0, 8);
【讨论】:
这项工作就像魅力一样,您可以选择将生成的字符类型,例如:
“upper_case”、“lower_case”、“number”、“special_character”
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
]
);
【讨论】:
一个好的或有效的方法是:
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() 的第二个参数,它会为唯一值添加熵: -)
我宁愿用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);
使用base64_encode(),输入一些rand() 数字,并剪掉前8 个字符,这肯定是字母或数字。这不是一个完全随机的组合,因为输入只是整数。但这对于默认用户密码来说已经足够了。 (否则在编码前通过chr() 使用rand()。)
【讨论】:
【讨论】:
rand(),即-$pwd = rand(10000000, 99999999);
出于您的目的,您可以使用以下方法生成随机码:
bin2hex(random_bytes(10))
请注意,这里我们使用random_bytes,它是在 PHP 7 中引入并使用加密随机生成器,如果您希望随机代码难以猜测,这一点很重要。 random_int 也在 PHP 7 中引入,同样使用加密随机生成器。
许多其他用于随机值生成的解决方案,包括涉及time()、microtime()、uniqid()、rand()、mt_rand()、str_shuffle()、array_rand() 和 shuffle() 的解决方案还有很多如果随机字符串用作密码、承载凭证、随机数、会话标识符、“验证码”或“确认码”或其他秘密值,则可预测且不适合。
上面的代码生成一个由 20 个十六进制字符组成的字符串(0 到 9,或 A 到 F)。如果你想使用更大的字符集(比如所有大写字母、所有小写字母和10位数字),这是一个更复杂的过程,但你必须使用random_int而不是rand() 、mt_rand()、str_shuffle() 等,如果字符串将用作密码、“确认码”或其他秘密值。请参阅answer to a related question。
在生成唯一标识符时,我还会列出other things to keep in mind,尤其是随机标识符。
【讨论】: