我创建了一个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能力的限制,而且强制执行总是很慢。
如果有一项服务可以做同样的事情,我想这也会有用。
答案 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
答案 2 :(得分:1)
请仔细阅读本文,因为我相信这是您的最终目标:http://en.wikipedia.org/wiki/Password_cracking
答案 3 :(得分:0)
不是说我完全回答了你的问题(由于大量的排列,仍然存在性能和内存限制),但这是我想到的算法之一:将字符串视为基数中的一个大数字N,其中N是允许的字符数。
0
(最后一个“最大”允许符号),则递增它。否则,将字符设置为a
并增加前一个符号(如果它不等于0
)。否则,......你明白了。这个算法的一个好处是你可以将它包装在像getNextString()
这样的函数中并调用它需要的次数。
此外,没有递归,因此在大多数语言中应该更快。
答案 4 :(得分:0)
什么是更好的程序/语言/设置速度?
C / C ++将是一门优秀的语言。并使用递归。