-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 个字符的长字符串,请仅使用 3 个嵌套的 for。

它可能不优雅,但它有效。我的问题是速度/崩溃。

自然,尝试通过浏览器运行它是一个坏主意。什么是更好的程序/语言/设置速度?我知道无论如何我都可能受制于 CPU 的能力,而且暴力破解总是很慢。

如果有一项服务可以做同样的事情,我想这也可以。

4

5 回答 5

5

您将没有地方存储输出。您说的是 3.656e+15 组合,因此您将其附加到 DOM 元素的方法行不通。

即使您使用 C/C++ 或 Java,您仍然在谈论可能不适合您的存储容量的东西。如果您只是动态提交它们(而不是存储它们),那么提交这么多请求将花费很长时间。我认为您在这里尝试完成的任何(阴暗?)事情都不会成功。

于 2012-04-12T20:01:05.480 回答
2

您正在创建 3656158440062976 个字符串,以每秒 100 万个字符串的速度,您的脚本将运行 115 年,以每秒 10 亿个字符串的速度运行 42 天。结果字符串 (your $('#URLs').append) 将是 36 PB,每个字符 1 个字节。

我投票不可行

(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

参见wolfram alpha

于 2012-04-12T20:09:29.553 回答
1

尝试阅读此内容,因为我相信这是您的最终目标:http ://en.wikipedia.org/wiki/Password_cracking

于 2012-04-12T20:23:08.350 回答
0

什么是更好的程序/语言/设置速度?

C/C++ 将是很好的语言。并使用递归。

于 2012-04-12T20:24:23.267 回答
0

并不是说我完全回答了您的问题(由于大量排列,仍然存在性能和内存限制),但这是我想到的算法之一:将字符串视为基数 N 中的一个大数,其中N 是允许的字符数。

  1. 以字符串 aaaaa..aa 开头
  2. 如果最后一个位置的字符不相等0(最后一个,“最大”允许的符号),则增加它。否则,将字符设置为a并递增前一个符号,如果它不等于0。否则,……你明白了。
  3. 重复步骤 2 所需的次数。

这个算法的一个好处是你可以把它包装在一个函数中,getNextString()然后调用它需要的次数。此外,没有递归,因此在大多数语言中应该更快。

于 2012-04-12T20:21:47.020 回答