枚举密码的时候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.