我必须生成一个固定长度为10个字符的随机字符串。但诀窍是它必须包含至少一个小写字母,一个大写字母,一个数字和一个这些符号:`〜!@#$%^& *()_- + = {} [] |:; “'<>?,/
之前我使用过这个简单的函数:
function generateRandomString($length = 10)
{
$characters='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/';
$result = '';
for ($i = 0; $i < $length; $i++)
$result .= $characters[rand(0, strlen($characters) - 1)];
return $result;
}
但是此功能不包括所需的每种字符类型中的至少一种。即使我走另一条路线:
function generateRandomString($length = 10)
{
$dig = '0123456789';
$low = 'abcdefghijklmnopqrstuvwxyz';
$upp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$sym = '`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/';
$result = '';
for ($i = 0; $i < $length; $i++)
{
$foo = rand(1,4);
switch ($foo)
{
case 1:
$result .= $dig[rand(0, strlen($dig)-1)];
break;
case 2:
$result .= $low[rand(0, strlen($low)-1)];
break;
// etc.
}
return $result;
}
这仍然不一定至少包含每个中的一个。 所有角色必须随机放置。所以任何帮助将不胜感激。谢谢。
答案 0 :(得分:5)
我不太了解PHP,但我想你可以做这样的事情(原谅语法错误):
$result = "";
$result .= $dig[rand(0, strlen($dig) - 1];
$result .= $low[rand(0, strlen($low) - 1];
$result .= $upp[rand(0, strlen($upp) - 1];
$result .= $sym[rand(0, strlen($sym) - 1];
// at this point, you have one of each
// Go through your for loop 6 more times, and then finally:
$result = str_shuffle($result)
希望有所帮助。 str_shuffle似乎很有用。
答案 1 :(得分:2)
您可以构建列表,然后使用str_shuffle
。我确信这可以简化并写得更好一些,但这很有效。
我添加了百分比方法,因此您可以拥有每个字符的特定百分比。
function generateRandomString($length = 10) {
$result = getRandomString(.2 * $length, '0123456789');
$result .= getRandomString(.3 * $length, 'abcdefghijklmnopqrstuvwxyz');
$result .= getRandomString(.3 * $length, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
$result .= getRandomString(.2 * $length, '`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/');
$str_len = strlen($result);
if($str_len != $length) $result .= getRandomString($length - $str_len, 'abcdefghijklmnopqrstuvwxyz');
return str_shuffle($result);
}
function getRandomString($length, $characters) {
$result = '';
$strlen = strlen($characters);
for($i = 0; $i < floor($length); $i++) $result .= $characters[rand(0, $strlen - 1)];
return $result;
}
echo generateRandomString(31);
答案 2 :(得分:2)
如果您的发电机不需要非常快,您可以这样做:
do {
$string = generateRandomString(10);
} while(!check_password_rules($string))
function check_password_rules($string) {
// return true if password fits policy
}
它的优势在于您不会通过为字符组设置固定概率来牺牲任何随机性。