提高ArrayList排列的效率

问题描述 投票:0回答:2

作为一个小项目,我正在制作一个“密码”破解程序,只是通过字母表和数字和符号的所有排列来强制执行,直到密码被猜到。

当然,这非常低效,我正在寻找方法让它更快一些。

我的想法是按照它们的大小排列排列。所以现在,它将从ArrayList中的第一个字符开始,并不断添加下一个字符,猜测变得越来越大。所以举个例子..

一个ArrayList,其值为(A, B, C, D),我当前的程序将创建这样的排列:

(A)(A, B)(A, B, C)(A, B, C, D)(A, B, D)(A, B, D, C)

但是更有效的方法(因为大多数密码长度不超过60个字符),将会经历这样的排列

qazxsw poi,qazxsw poi,qazxsw poi,(A)(B)(C)(D)(A, B)(A, C)等等

这就是我目前的程序:

(A, D)

关于如何将其改进为更“高效”(实际上不是更有效,对于更短的密码更有用)方法的任何想法?

java arraylist permutation
2个回答
1
投票
(B, A)

1
投票

只需从基数x开始计数,其中x是您拥有的字符数。例如,如果您只关心数字,那么您将使用常规基数10系统。以这种方式看待它是非常微不足道的,像50045这样的东西永远不会出现在5之前。

这样做很简单,只需要在开头加一个0的数组,然后每次需要一个新密码时,将第一个元素增加一个。如果它超过你拥有的字符数,只需将其设置为零并将一个添加到下一个(如果它是最后一个,则推送一个新元素)。

你可以通过使用一个简单的long(或者BigInteger用于较大的数字,long将不能包含超过10个字符用于你的设置)来比这更简单,然后从中获取字符,只需递归取你工作的数字和基数的模数,然后除以基数。这看起来像这样:

(B, C)
© www.soinside.com 2019 - 2024. All rights reserved.