多线程暴力破解密码算法 我用C++编写了一个多线程程序,用蛮力算法破解7个字符长(小写字符)的密码。

多线程暴力破解密码算法 我用C++编写了一个多线程程序,用蛮力算法破解7个字符长(小写字符)的密码。,c++,multithreading,algorithm,brute-force,C++,Multithreading,Algorithm,Brute Force,我的算法主要是从a到z的7个嵌套循环,并测试每个可能的组合 现在,我正在这样分配我的工作: 如果我有3个工作线程, 线程1:axxxxxx到ixxxxxx 线程2:jxxxxxx到rxxxxxx 螺纹3:sxxxxxx至zxxxxxx 因此,这3个线程将继续循环,直到找到匹配 主线程将等待第一个线程返回 我的问题是:这是在线程之间分配工作的最佳方式吗?你知道我怎样才能更有效率吗 另外,即使这不是我询问的主要部分,你能想出比7 for循环迭代更好的方法吗 (请注意,此程序用于学校项目,而不是真正破

我的算法主要是从a到z的7个嵌套循环,并测试每个可能的组合

现在,我正在这样分配我的工作:
如果我有3个工作线程,
线程1:axxxxxx到ixxxxxx
线程2:jxxxxxx到rxxxxxx
螺纹3:sxxxxxx至zxxxxxx

因此,这3个线程将继续循环,直到找到匹配

主线程将等待第一个线程返回

我的问题是:这是在线程之间分配工作的最佳方式吗?你知道我怎样才能更有效率吗

另外,即使这不是我询问的主要部分,你能想出比7 for循环迭代更好的方法吗


(请注意,此程序用于学校项目,而不是真正破解密码)

我想看看英特尔TBB

我会在outerloop上为构造使用一个
parallel_,并使用一个原子变量来表示找到了它

使用lambdas时,这是一个非常复杂的问题

tbb::blocked_range<char> rng('a', 'z');
tbb::parallel_for(rng, [&](tbb::blocked_range<char> rng){ 
     for(char a=rng.begin(); a!=rng.end(); ++a)
     {
         //a is your top level character
     }
}); 
tbb::阻塞范围rng('a','z');
(rng,[&](tbb::blocked_range rng){
对于(字符a=rng.begin();a!=rng.end();++a)
{
//a是你的顶级角色
}
}); 

使用TBB的优点是,如另一个答案中所述,如果一个线程在另一个TBB之前完成,则构建了一个工作窃取机制,以允许快速线程从较慢的线程上取下工作。

如果所有键的可能性相同,并且如果每个键评估一个键的成本相同,如果每个线程可以预期分配给一个CPU而不会出现很多中断(例如,您的进程是唯一一个运行的CPU密集型进程),那么按照您所做的方式对键空间进行均匀分区将非常有效

如果这些假设中有一些是无效的,那么构建程序的更灵活的方法是让一个线程(生产者线程)将密钥范围分发给一个或多个消费者线程进行处理。一旦一个给定的线程完成了它的工作块,它将返回到生产者并请求一个新的密钥范围进行分析


生产者/消费者模式有一些开销,但它更灵活。

您应该使用生产者-消费者模式。 具有(线程安全的)队列以生成密码候选,以及使用者线程 这应该更加灵活

对于生成密码,您的方法没有任何问题,但是使用较长的密码可能会很乏味

您可以使用递归方案来生成它。
或者使用一个循环的迭代方案,ascii表上的a-z字符是顺序的,因此您可以使用base 26转换来生成候选项。

您能想出比7 for循环迭代更好的方法吗?递归。一个非常有效的方法是在GPU中进行递归。请看。@jweyrich:如果您试图破坏散列,这是一个很好的解决方案,但如果您必须实际尝试登录,这不是很有用。谢谢,尽管这些假设是有效的,但我将继续使用生产者线程。您让我意识到,这样做的目的并不是减少所做的测试的数量(这是我最初的目标),而是让它们尽可能快地完成(如果一个线程得到更少的中断,它将继续进行更多的测试)。