在我开始讨论实际问题之前,我想澄清一些事情,因为我知道,当脱离上下文时,“使用javascript强制执行”是多么荒谬:)。
我正在为我的学士论文工作,最后我的目标是实现一个概念验证的基于Javascript的哈希破解器。我的想法是这样工作: 用户可以提交哈希值以及有关所用算法的信息。 (其他)用户也可以点击网站上的按钮以参与破解过程。 服务器的任务是接受并将提交的“订单”拆分为范围,具体取决于可用工作人员的数量。然后将范围发送给点击所述按钮的客户。
我目前陷入了如何实际实施这种强力功能的两大问题。 所以我现在的主要问题是,坦率地说,我还没有真正解决Javascript问题。对于初学者,我只会使用硬编码字符集:字母数字,小写和大写,没有特殊字符。问题是我老实说完全不知道如何实际实现将尝试字符组合的函数,如何编程。我可以想象使用包含charset的普通数组,然后是两个字符串。一个字符串将包含范围,另一个字符串将包含尝试的组合。所以我会以某种方式迭代charset数组,字符串可能是级联的for循环或其他东西,但我真的坚持'如何'的问题:)。我不希望你们中的任何人真正为我提供这样一个函数的完整源代码(当然除非你想要),但我真的很感激有关如何实现这种强力函数的一些提示或解释。此时我也不打扰性能或优化编码,而是关于全面编码,或者您可能想要称之为的任何内容:)
很抱歉,如果我对问题中的某些细节感到困惑。如果是这样,请告诉我,我当然会尝试进一步澄清。
答案 0 :(得分:1)
字母表上的暴力样式功能。可能有更简单的方法来做到这一点。
function brute(alphabet, match, int_start, int_stop){
var a = alphabet, al = 0, // for alphabet
m = match.toString(), ml = m.length, // for our compare
i = int_start || 0, j = int_stop || 0, // range of numbers to test
k = 0, l = 0, add = 0, sub = 0, diff = 0, // for building test string
test = '', found = false; // test string and result
if(i < 0) throw 'int_start must be at least 0';
if(a.constructor !== undefined){ // We need a string or array as
if( a.constructor.name !== 'String' && // our alphabet so we check for
a.constructor.name !== 'Array' ) // correct input and modify if
a = a.toString(); // necessary, or if we can't,
}
else throw 'Bad alphabet type'; // we throw an error
al = a.length; // shorthand length
add = al; // when i=0, we start prefix here
while(add <= i - sub) sub += add, // then work out what we have to
add = add * al; // prefix our number with
diff = add - sub; // shorthand to save calculations
while( i < j ){ // actual brute force loop starts here
test = ''; // empty any previous string
k = diff + i; // convert our number from "x" to "1x"
while(k > 0){ // build it as a string
l = k % al; // get index of digit
test = a[l] + test; // add digit to string
k = ( k - l ) / al; // move digits along
}
test = test.substring(1); // cut off the initial "1" we added
if(test.length === ml && test === m){ // compare test to what you want
found = true;
break;
}
i++; // prepare for our next loop
if(i - sub === add) // and if we need another digit
sub += add, // then recalculate our prefix
add = add * al, // and then
diff = add - sub; // update the shorthand
}
// brute force ended, let's see what we've got
if(found === false) i = -1; // if not found, return -1 as index
return [i, test, m]; // index found, string found with, what we were looking for
}
然后使用例如
brute('0123abcd', '0c', 0, 20); // [14, "0c", "0c"]