Накостылил путём замера времени выполнения ф-ии - иногда срабатывает на одиночном пароле, но чаще либо ошибается либо в лимит времени не укладывается. Возможно надо искать не самый долгий цикл, а присваивать им рейтинги (и потом сложить). Нет времени возиться.
function crack(login) {
console.log('login:', login);
var n=0;
var pass = ''
for( var len=0; len<28; len++ ) {
var probes = []
var list = [0,1,2,3,4,5,6,7,8,9] //список цифр для подстановки
var probe=0
do {
probe+=2
var a = []
for( n in list ) {
var nn = pass+n
var hr1, hr = process.hrtime()
for( var i=0; i<12000+(len*100*probe); i++ ) {//<--подобрать кол-во расшифровок
login(nn)
}
hr1 = process.hrtime()
hr1 = String(hr1[0]).slice(-1) + String(hr1[1]).padStart(9, '0')
hr = String(hr[0]).slice(-1) + String(hr[1]).padStart(9, '0')
var t = Number(hr1) - Number(hr)
a[n] = t
}
var max = Math.max.apply(null, a.filter(n=> n!=undefined))
var pass_probe = pass + a.indexOf(max)
var next = true
probes[pass_probe] = Number(probes[pass_probe] || 0) + 1
//надо чтоб число несколько раз оказалось самым долгим:
if( probes[pass_probe] > 2 ) {
next = false
pass = pass_probe
}
//console.log( 'PASS:', pass_probe )
//удалить индекс с самым маленьким временем выполнения:
var del_list = []
var min = Math.min.apply(null, a.filter(n=>n != undefined));
del_list.push(min)
if( probes[pass + a.indexOf(min)] == undefined ) delete( list[ a.indexOf(min) ] );
//ещё раз
var min = Math.min.apply(null, a.filter(n=>n != undefined && del_list.indexOf(n) == -1));
del_list.push(min)
if( probes[pass + a.indexOf(min)] == undefined ) delete( list[ a.indexOf(min) ] );
//третий раз
var min = Math.min.apply(null, a.filter(n=>n != undefined && del_list.indexOf(n) == -1));
del_list.push(min)
if( probes[pass + a.indexOf(min)] == undefined ) delete( list[ a.indexOf(min) ] );
//4-ый
//var min = Math.min.apply(null, a.filter(n=>n != undefined && del_list.indexOf(n) == -1));
//del_list.push(min)
//if( probes[pass + a.indexOf(min)] == undefined ) delete( list[ a.indexOf(min) ] );
} while( next )
}
//последние четыре цифры быстрее подобрать влоб:
for( i=0; i<=9999; i++ ) {
if( login(pass + String(i).padStart(4, '0')) ) break
}
return pass + String(i).padStart(4, '0')
//return '12345678901234567890123456789012';
}