02.05.2018, 21:39
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
Math.pow(arr.length, длина_пароля) комбинаций;
8 для такого многовато, если пароль в конце списка и проц среднячок это пару недель. при условии доработки кода.
Последний раз редактировалось j0hnik, 02.05.2018 в 21:41.
|
|
02.05.2018, 21:42
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Длина массива действительно ограничена, а от длины слова количество вариантов растёт экспоненциально.
Но можно лёгким движением руки превратить функцию в генератор, и получить столько значений сколько надо :
function* generate(arr, n, startIndex){
for(var length = arr.length, i = Math.pow(length, n) - (startIndex||0), temp = new Array(n), j; i--;){
j = n;
while(j--){
temp[j] = arr[i / Math.pow(length, j) % length | 0];
}
yield temp.join('');
}
}
var generator = generate(['A','B','C','D','E'], 4);
alert(generator.next().value);
alert(generator.next().value);
Ограничены вы только временем.)
__________________
29375, 35
|
|
02.05.2018, 23:07
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
Aetae,
пробовал ваш код в качестве генератора, но такой скорости к сожалению не дает.
7 символов еще можно, больше наверное ждать смысла нет.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width: 100%;
}
.wrap{
margin: 20px auto;
width: 500px;
}
.pass{
color: red;
}
.time, .speed, .data, .pass, .tek, .ost{
margin: 5px 0;
}
</style>
</head>
<body>
<div class="wrap">
<input type="text"> Пароль от 1 до 7 символов <br>
<select>
<option>1 поток</option>
<option>2 потока</option>
<option>3 потока</option>
<option>4 потока</option>
<option>5 потоков</option>
<option>6 потоков</option>
<option>7 потоков</option>
<option>8 потоков</option>
<option>9 потоков</option>
<option>10 потоков</option>
<option>11 потоков</option>
<option>12 потоков</option>
</select>
<button>Старт</button>
<div class="time">Время выполнения <span>0</span> сек.</div>
<div class="speed">Скорость перебора <span>0</span> млн п/с</div>
<div class="comb">Испытано комбинаций <span>0</span></div>
<div class="tek">Текущая комбинация <span>......</span></div>
<div class="ost">Оставшееся время <span>Infinity</span></div>
<div class="pass"><span></span></div>
</div>
<script>
var inp = document.querySelector('input'),
sel = document.querySelector('select'),
btn = document.querySelector('button'),
time = document.querySelector('.time>span'),
speed = document.querySelector('.speed>span'),
comb = document.querySelector('.comb>span'),
tek = document.querySelector('.tek>span'),
ost = document.querySelector('.ost>span'),
pass = document.querySelector('.pass>span'),
w = [], dat = [], flag = 0, start = 0, t="*";
var workerBlobUrl = URL.createObjectURL(new Blob([workers.toString().replace(/^function .+\{?|\}$/g, '')],{type:'text/javascript'}));
btn.onclick = ()=> {
start = Date.now();
flag = 0, pot = sel.selectedIndex+1;
w.forEach(el=>el.terminate());
for(var i = 0; i<pot; i++) w[i] = new Worker(workerBlobUrl);
w.forEach((el,i)=>{
el.postMessage([inp.value, pot, i]);
el.onmessage=e=>{
if(typeof e.data[0] !== 'number') {
flag = 1;
ps = e.data[0];
}
else {
dat[i]=e.data[0];
t = e.data[1].join('');
}
if(flag) el.terminate();
};
});
vdata();
};
vdata=()=>{
if(flag===0){
if(dat[0]) {
var c = dat.reduce((a,b)=>a + b);
c = c!=NaN? c: 0;
c = c!=undefined? c: dat[0];
var spd = (c/pr/1000000).toFixed(0);
speed.innerHTML = spd;
comb.innerHTML = c;
tek.innerHTML = t;
var num = [0, 62e8, 567e9, 51676e9];
var x = num.findIndex(el=>c<el);
ost.innerHTML = ((c-num[x])/spd/60000000).toFixed(1)+' мин. '+(x+4)+' цифр';
}
pr = ((Date.now() - start)/1000).toFixed(1);
time.innerHTML = pr;
setTimeout(vdata,100);
}
else pass.innerHTML = 'Найден пароль: '+ps.join('');
};
//worker
function workers(){
self.onmessage = function(e){
var arg = e.data;
p = arg[0].split('');
var arr = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-=_+[]{}:;"|<>?'/.`.split(''),
w = arr.length, a = [], c = 0;
var a1 = Math.floor(w/arg[1]*arg[2]);
var a2 = Math.floor(w/arg[1]*(arg[2]+1));
for(var e = 0; e<=w; e++){
for(var i = 0; i<=w; i++){
for(var j = 0; j<=w; j++){
for(var k = 0; k<=w; k++){
for(var l = 0; l<=w; l++){
for(var m = 0; m<=w; m++){
for(var n = a1; n<a2; n++){a[0] = arr[n]; c++;for(var x=0,z=1;x<7;x++) if(a[x]!==p[x]){z=0; break;} if(z){self.postMessage([a]);return;}
}a[1] = arr[m];
}a[2] = arr[l];
}a[3] = arr[k];
}a[4] = arr[j]; self.postMessage([c,a]);
}a[5] = arr[i];
}a[6] = arr[e];
}
};
}
</script>
</body>
</html>
у меня ff разгоняется до 1.3 млрд в сек
|
|
02.05.2018, 23:10
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
все методы заменил на циклы процентов на 15 % стало быстрей.
|
|
02.05.2018, 23:28
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Ну то что генераторы замедляют - оно понятно. Без генераторов просто вместо yield temp.join(''); делаешь то, что тебе нужно, self.postMessage там или ещё что. Суть в том чтобы не складывать значения в массив, а использовать сразу по назначению. Ещё капельку ускорить можно заранее сгенерировав Math.pow(length, j) для всех j.
__________________
29375, 35
|
|
02.05.2018, 23:37
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
Aetae,
Я их и не использовал, взял код с 26 поста и убрал все лишнее но увы =(
|
|
02.05.2018, 23:44
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
function generate(arr, n){
var length = arr.length, x=0;
result = new Array(Math.pow(length, n));
for(var i = result.length, temp = new Array(n), j; i--;){
j = n;
while(j--){
temp[j] = arr[i / Math.pow(length, j) % length | 0];
x++;
}
}
return x;
}
alert(generate(['A','B','C','D','E'], 4));
|
|
03.05.2018, 00:36
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Мде, видать какие-то оптимизации не проходят. Даж если вообще все вычисления убрать всё равно меделеннее чем хардкод нескольких циклов. Но самое интересное, что быстрее минимум в 2 раза от хардкода работает рекурсивная версия:
https://jsperf.com/generate-brut/1
Чёртова магия.=\
__________________
29375, 35
Последний раз редактировалось Aetae, 03.05.2018 в 00:42.
|
|
03.05.2018, 00:48
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
Aetae,
Mб join убрать и посмотреть?
|
|
03.05.2018, 00:58
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
Aetae,
|
|
|
|