-4

数字と小文字が関係する文字列のすべての可能な組み合わせを生成する jquery スクリプトを作成しました。必要な文字列の長さは 10 文字だけなので、それを制御する if ステートメントを挿入しました。

興味のある方のために、スクリプトは次のとおりです。

$(document).ready(function(){

    var parts = ['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','1','2','3','4','5','6','7','8','9','0'];
    var url = "";

for (var a = 0; a < parts.length; a++) {
    for (var b = 0; b < parts.length; b++) {
        for (var c = 0; c < parts.length; c++) {
            for (var d = c + 1; d < parts.length; d++) {
                for (var e = d + 1; e < parts.length; e++) {
                    for (var f = e + 1; f < parts.length; f++) {
                        for (var g = f + 1; g < parts.length; g++) {
                            for (var h = g + 1; h < parts.length; h++) {
                                for (var i = h + 1; i < parts.length; i++) {
                                    for (var j = i + 1; j < parts.length; j++) {
                                            url = parts[a]+parts[b]+parts[c]+parts[d]+parts[e]+parts[f]+parts[g]+parts[h]+parts[i]+parts[j];
                                            if (url.length === 10) {
                                                $("#URLs").append(url+', ');
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

});

文字スポットごとに for ループがあります。3文字の長さの文字列が必要な場合は、ネストされたforを3つだけ使用してください。

エレガントではないかもしれませんが、機能します。私の問題は速度/クラッシュです。

当然、これをブラウザで実行しようとするのは悪い考えです。速度を上げるために、より良いプログラム/言語/セットアップは何でしょうか? おそらく何があっても自分の CPU の能力に縛られていることと、ブルート フォーシングは常に遅いことを理解しています。

これと同じことを行うサービスがあれば、それもうまくいくと思います。

4

5 に答える 5

5

出力を保存する場所はありません。3.656e + 15の組み合わせについて話しているので、それをDOM要素に追加するというアプローチは機能しません。

C / C ++またはJavaを使用した場合でも、ストレージ容量に対しておそらく実行不可能なことについて話していることになります。また、動的に送信しただけの場合(保存する場合とは異なり)、その数のリクエストを送信するには時間がかかります。私はあなたがここで成し遂げようとしているどんな(怪しげな?)ことでもあなたが成功するとは思わない。

于 2012-04-12T20:01:05.480 に答える
2

3656158440062976 個の文字列を作成しています。1 秒あたり 100 万文字列の場合、スクリプトは 115 年間実行され、1 秒あたり 10 億文字列の場合は 42 日かかります。結果の文字列 ( your $('#URLs').append) は、1 文字あたり 1 バイトで 36 ペタバイトになります。

私は実行不可能に投票します

(Math.pow(36,10)/1000000)/(60*60*24*365)
=115.93602359408219
(Math.pow(36,10)/1000000000)/(60*60*24)
=42.31664861184
(Math.pow(36,10)*10)/(1000*1000*1000*1000*1000)
=36.56158440062976

ウルフラム アルファを参照

于 2012-04-12T20:09:29.553 に答える
1

これがあなたの最終目標であると私は信じているので、これを読んでみてください:http: //en.wikipedia.org/wiki/Password_cracking

于 2012-04-12T20:23:08.350 に答える
0

私があなたの質問に完全に答えているとは言えませんが(膨大な数の順列のためにパフォーマンスとメモリの制限がまだあります)、これが私の頭に浮かんだアルゴリズムの1つです:文字列をベースNの大きな数として扱います。 Nは許可される文字数です。

  1. 文字列aaaaa..aaで開始
  2. 最後の位置の文字が等しくない場合0(最後の「最大の」許可された記号)、それをインクリメントします。それ以外の場合は、文字をに設定しa、前の記号が。と等しくない場合はインクリメントします0。そうでなければ、...あなたはポイントを取得します。
  3. 手順2を必要な回数繰り返します。

このアルゴリズムの良いところは、のような関数にまとめて、getNextString()必要な回数だけ呼び出すことができることです。また、再帰がないため、ほとんどの言語で高速になるはずです。

于 2012-04-12T20:21:47.020 に答える
0

速度を上げるために、より良いプログラム/言語/セットアップは何でしょうか?

C/C++ は良い言語です。そして、再帰を使用します。

于 2012-04-12T20:24:23.267 に答える