首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多线程暴力破解密码算法

多线程暴力破解密码算法
EN

Stack Overflow用户
提问于 2012-03-19 11:42:06
回答 3查看 4.2K关注 0票数 3

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

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

现在,我这样划分我的工作:

如果我有3个工作线程,

线程1: axxxxxx到ixxxxxx

线程2: jxxxxxx到rxxxxxx

线程3: sxxxxxx到zxxxxxx

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

主线程会等待第一个线程返回。

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-19 11:51:40

如果所有键的可能性都是相等的,如果每个键的评估成本都是相同的,如果每个线程都可以被分配到一个CPU,而不会有很多中断(例如,您的进程是唯一运行的CPU密集型进程),那么像您所做的那样均匀地划分键空间将是非常有效的。

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

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

票数 6
EN

Stack Overflow用户

发布于 2012-03-19 11:47:44

我会看一看英特尔TBB

我将在外部循环上使用parallel_for结构,并使用一个原子变量来表示找到它。

使用lambdas,这是非常简单的。

代码语言:javascript
运行
复制
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的优点是,正如在另一个答案中提到的那样,如果一个线程在另一个线程之前完成,TBB会构建一个工作窃取机制,允许快速线程从较慢的线程上窃取工作。

票数 1
EN

Stack Overflow用户

发布于 2012-03-19 11:52:08

您应该使用生产者-消费者模式。有一个(线程安全的)队列来产生密码候选,消费者线程应该更灵活。

要生成密码,您的方法没有任何问题,但是使用较长的密码可能会很繁琐。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9764746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档