所有可能的组合字符串 - 速度

时间:2012-04-12 19:52:14

标签: jquery for-loop combinations

我创建了一个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个嵌套的。

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

当然,试图通过浏览器运行它是一个坏主意。什么是更好的程序/语言/设置速度?据我所知,无论如何我都可能受到CPU能力的限制,而且强制执行总是很慢。

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

5 个答案:

答案 0 :(得分:5)

你不会有存放输出的地方。你说的是3.656e + 15种组合,所以你将它附加到DOM元素的方法是行不通的。

即使你使用过C / C ++或Java,你仍然在谈论一些可能对你的存储容量不可行的东西。如果您只是动态提交请求(与存储它们相比),那么提交许多请求将会很长时间。我不认为你在这里想要完成的任何事情(阴暗?)都会成功。

答案 1 :(得分:2)

您正在创建3656158440062976个字符串,每秒100万个字符串,您的脚本将运行115年,每秒10亿个字符串,这将是42天。结果字符串(您的$('#URLs').append)将为每个字符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

请参阅wolfram alpha

答案 2 :(得分:1)

请仔细阅读本文,因为我相信这是您的最终目标:http://en.wikipedia.org/wiki/Password_cracking

答案 3 :(得分:0)

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

  1. 以字符串aaaaa..aa
  2. 开头
  3. 如果最后位置的字符不等于0(最后一个“最大”允许符号),则递增它。否则,将字符设置为a并增加前一个符号(如果它不等于0)。否则,......你明白了。
  4. 重复步骤2所需的次数。
  5. 这个算法的一个好处是你可以将它包装在像getNextString()这样的函数中并调用它需要的次数。 此外,没有递归,因此在大多数语言中应该更快。

答案 4 :(得分:0)

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

C / C ++将是一门优秀的语言。并使用递归。