PHP 十进制转任意进制
评论 0 热度 653
枚举密码的时候YY出来的,因为生成密码需要像一次函数一样每一个自变量对于一个因变量,若是生成6位的密码本,光数字和小写字母就有36^6种可能、(36^6)*6个密码位,而且每个密码位占用1 Byte,则约为12.16 GB,所以很自然就想到了用10进制转换成K进制,即可避免巨型的字典,也方便二次执行脚本。缺点的话嘛,需要计算一下$n的取值范围才能生成指定位数的密码。
function cpsw($n){
$chars = ['0','1','2','3','4','5','6','7','8','9',"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
#$chars = ['0','1'];
if ($n < 2) return $chars[$n];
//除K取余法
$k = count($chars);
$rs = "";
$lv = floor($n / $k);
while ($n > 0) {
$rs .= $chars[$n - $k * $lv];
$n = $lv;
$lv = floor($lv / $k);
}
return strrev($rs);
}
#usage:
for ($i=10000000; $i < 10001000; $i++) {
echo cpsw($i)."\n";
}
然而到最后还是决定写一个微型字典
内容大概如下(生成 三个字母+1980~2000年所有生日 类型的密码):
[wlu][wlu][wlu][1980-2000][0-12][0-31]
然后再写个解析器,perfect.