我正在制作一个通过并行化强制密码的程序。目前破解密码已经以纯文本形式提供,我只是试图暴力破解它。
我有一个名为的函数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
-large 切片(例如,对于 4 个线程,0..2.5e11、2.5e11..5e11 等)。这不好,因为范围的末端是任意超大密码长度(10+,我不知道),而大多数密码(包括我倾向于尝试的固定“zzzzz”)要短得多,因此我得到的是第一个线程完成所有工作,其余线程只是浪费时间测试太长的密码和同步;结果实际上比单线程性能慢。
我怎么能将任意大范围(实际上不必有结束)分成范围块,并让每个线程在块中找到?这将使不同线程中的工作人员真正有用。