鸡兔同笼怎么解?最笨也最稳的办法:把可能的组合挨个代入验证,总有一组成立。这个思路就是穷举法,也叫枚举法——不找捷径,把所有可能性列出来逐个试。小学奥数、程序填空题里都有它的影子。
作为一种算法思路
穷举法的特点是简单、必然出正确答案,代价是计算量大。适合解空间小、或没有更好办法的问题:百钱买百鸡这类整数问题、数独盘面搜索、在一组数据里找最大值。比如找 1 到 1000 里的素数,挨个用 2 到根号 n 试除,一个双重循环写完就能跑,调试也容易。缺点同样明显:可能性按指数涨,10 个开关的排列组合就是 2 的 10 次方,解空间一大就跑不动了,这时才轮到动态规划、剪枝这些优化手段。
放到密码上就是另一回事
密码领域的穷举,指把所有可能的密码组合挨个试,直到蒙对为止。理论上一切密码都能穷举,区别只在时间:纯 6 位数字密码,可能性只有一百万种,现代硬件很快就能扫完;而一个 12 位、大小写字母加数字加符号混排的密码,穷举时间会拉长到天文数字级别。这就是为什么网站都要求复杂密码——不是刁难你,是在拉高穷举成本。撞库是它的近亲:拿别的网站泄露的账号密码来试,所以不同网站别用同一个密码。
网站靠什么挡住穷举
- 验证码:机器批量试密码过不了人机校验这一关
- 登录失败锁定:连续输错几次锁定一段时间,穷举节奏直接被打断
- 接口限流:限制单位时间内的请求次数,扫描速度被压到没有意义
- 异地登录提醒:行为异常时通知本人
这些手段思路一致:提高成本,让试一次密码的代价大于收益,扫描自然就停了。自己的账号遇到「登录失败次数过多被锁定」不用慌,多半是防护机制在正常工作,等锁定期过了再试,顺手改个强密码更稳妥。
实际判断:算法小题,穷举法直接写,别过度设计;涉及账号密码,做好两件事——密码够长够杂、重要服务开二次验证,再配个密码管理器帮你记,穷举这条路就被堵死大半。