此批处理脚本的目的是实现一个简单的Brute Force算法,以便生成所有可能的10个字母数字字符长字符串,字符与下一个字符之间不会重复 .
set alphanumerics=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,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,0,1,2,3,4,5,6,7,8,9
for %%l in (%alphanumerics%) do (
for %%m in (%alphanumerics%) do (
for %%n in (%alphanumerics%) do (
for %%o in (%alphanumerics%) do (
for %%p in (%alphanumerics%) do (
for %%q in (%alphanumerics%) do (
for %%r in (%alphanumerics%) do (
for %%s in (%alphanumerics%) do (
for %%t in (%alphanumerics%) do (
for %%u in (%alphanumerics%) do (
if %%u NEQ %%t (
if %%t NEQ %%s (
if %%s NEQ %%r (
if %%r NEQ %%q (
if %%q NEQ %%p (
if %%p NEQ %%o (
if %%o NEQ %%n (
if %%n NEQ %%m (
if %%m NEQ %%l (
echo %%l%%m%%n%%o%%p%%q%%r%%s%%t%%u >> output.txt
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
这个脚本的主要问题是,为了完成任务所需的时间量仍然非常大,因为尽管各种 if
分支正在过滤最终输出,但仍然会由 for
块计算出数千个无效组合 . 因此,我真的想改进整个脚本,以最好的方式使用所有计算能力而不浪费它 . 我正在考虑在并行进程之间分配整个算法 . 或者,基于2的字符串生成器的强大功能:在第一步中,脚本可以生成并存储所有可能的字符对 .
for %%x in (%alphanumerics%) do (
for %%y in (%alphanumerics%) do (
if %%y NEQ %%x (
echo.%%x%%y >> output.txt
)
)
)
之后,在第二步中,它可以使用先前生成的伴随来匹配它们,产生四个字符长的字符串;然后,八个字符长等
for /f %%v in (output.txt) do (
set firstvar=%%v
set firstchar=!firstvar:~1!
;First character of the listed couples
for /f "skip=1" %%w in (output.txt) do (
set secondvar=%%w
set secondchar=!secondvar:~0,1!
;Last character of the listed couples
if !secondchar! NEQ !firstchar! (
echo.!firstvar!!secondvar! >> output_2.txt
)
)
)
总之,我如何才能改进这个算法以节省时间?
3 回答
下面的解决方案比你的快得多,也许这是在批处理文件中执行此操作的最快方法 .
如果每个位置有61个字符(邻居限制),除了第一个不受前一个字符限制的字符外,则必须生成
每秒生成1000000个组合,您需要22991年才能生成完整列表,并且需要在每个值后有10个字符和CRLF终结符,7728 PB的存储空间 .
但......
NOTE 1
脚本已编辑 . 由于JosefZ指出原始代码失败,因为批处理文件中的字符串替换不区分大小写(我忘记了) . 代码已更改为面对问题,包括填充程序,以便能够区分较低和较高的字符,但不包括在输出中 . 无论如何,在答案的最后可以找到原始的错误代码 .
执行代码时,
!_!
将包含在for
可替换参数中,但由于变量_
为空,它将不包含在echo
命令的输出中,替换为延迟扩展解析器阶段中的空字符串 .这是答案中的原始(和错误)代码 . 不能正确处理大小写字符串替换 .
NOTE 2
在写完之后我看到这是JosefZ's answer中的相同方法,但由于在过程中没有存储变量,它应该稍快一些 .
您可以提前排除可能的邻居匹配,如下所示 . 请注意,
alphanumerics
变量中的密码种子被剪切,输出仅缩小到每个万字,仅用于演示目的 .但是,我担心我们没有足够的时间(以及磁盘空间)来完成您的任务,因为迭代计数呈指数级增长甚至更快!
有
set "alphanumerics=a,b,A,B,0,1,"
的可能密码(在几分钟内找到) . 要查看增长时间(和空间),以下是使用set "alphanumerics=a,b,c,A,B,C,0,1,2,"
(密码种子中只有三个字符c,C,2,
更多)获得的结果的摘录:在超过 ten million iterations 之后仍然具有前导a
...