2

マルチスレッディングの実践において、文字セットのすべての可能な組み合わせ (ブルート フォース クラッキング/マッチング) を計算し、スレッド間で作業を分散できるアプリケーションを単純に構築して、スレッディングがどのように影響するかを直接測定して確認したいと考えていました。異なるシステムでのアルゴリズムの時間。

これを計算するアルゴリズムは、これまでのところ私にとって大きな課題でした。最近のスレッド ( What would be a effective way to add multithreading to this simple algorithm? ) で、アルゴリズムは単純に機能しませんでしたが、必要なことを理解しているように見えました (各文字範囲の特定の部分を簡単に渡して作業を分散させます)。 、そしてアプリケーションで修正するのに十分なほど複雑さを理解していませんでした。

シンプルで反復的な方法で、特定の長さ (つまり、長さが 5) の特定の文字セットのすべての組み合わせを計算するにはどうすればよいでしょうか?

例:

unsigned char range[] = "abcdefghijklmnopqrstuvwxyz0123456789";
brute_force(range, len); //character set, length of string to compute all combinations of
//...

これを行うための適切な概念を見つける際のストレスを和らげることができれば、非常にありがたいです。

4

2 に答える 2

2

1 つのアプローチ:

void brute_force(String range, int len) {
        for (int i = 0; i < range.length(); ++i) {
           final String x  = "" + range.charAt(i);
           Thread t = new Thread(){
               public void run() { brute_force(x, range[].replace(x, ""), len); };
            };
            t.start();
        }
}

brute_force(String, String, int)組み合わせを生成する場所。

于 2011-04-30T14:44:39.093 に答える
0

5つの要素のストレートフォワード反復ブルートフォーシング:

for c1 in set {
for c2 in set {
for c3 in set {
for c4 in set {
for c5 in set {
    test(c1,c2,c3,c4,c5);
}}}}}

作業をスレッド間で分割するには、スレッドごとに個別の「開始部分」をバイブします。したがって、最初のスレッドは「a」で始まるすべてのワードを処理し、2番目のスレッドは「b」を取ります。(26を超えるスレッドがある場合、最初のスレッドは'aa'、2番目の'ab'などを取得します。


長さに応じてより適切にスケーリングするソリューションが必要な場合は、問題を繰り返し表現することをお勧めします(必要に応じて、代わりに明示的なスタックを使用してバージョンに変換できます)。

unsigned char charset = /**/
unsigned int setsize = sizeof charset;

bool test(combination);   

function bruteforce(output, n){
  /* Goes through all character combinations of length n,
     writing them in output and calling test on them afterwards */
  if(n == 0){
    test(output);
  }else{
    for(int i=0; i<setsize; i++){
      output[n-1] = charset[i];
      bruteforce(output, n-1);
    }
  }
}

unsigned char my_output[final_length];
bruteforce(my_output, final_length);
于 2011-04-30T14:36:10.497 に答える