Я делаю программу, которая грубо форсирует пароль путем распараллеливания.В настоящее время пароль для взлома уже доступен в виде обычного текста, я все равно пытаюсь его перебором.
У меня есть функция с именем generate_char_array()
, которая на основе целочисленного начального числа преобразует основную ивозвращает u8
кусок символов, чтобы попробовать и проверить.Сначала идет алфавит для 1 строки символов, затем 2 и т. Д.
let found_string_index = (0..1e12 as u64).into_par_iter().find_any(|i| {
let mut array = [0u8; 20];
let bytes = generate_char_array(*i, &mut array);
return &password_bytes == &bytes;
});
С помощью индекса найденной строки (или, скорее, целого числа) я могу сгенерировать найденную строку.
Проблема в том, что способ, которым Rayon распараллеливает это для меня, разбивает произвольный большой целочисленный диапазон на thread_count
-большие срезы (например, для 4 потоков, 0..2.5e11, 2.5e11..5e11 и т. Д.).Это нехорошо, потому что конец диапазона предназначен для произвольно сверхбольших паролей (10+, я не знаю), тогда как большинство паролей (включая фиксированный "zzzzz", который я стараюсь) намного короче, и поэтомучто я получаю, так это то, что первый поток выполняет всю работу, а остальные потоки просто тратят время на проверку слишком длинных паролей и синхронизации;в результате получается производительность на самом деле ниже, чем у одного потока.
Как я мог вместо разделить произвольный большой диапазон (не долженна самом деле есть конец) на куски диапазонов и каждый поток находится внутри кусков?Это сделало бы рабочих из разных потоков действительно полезными.