我有一个多线程程序,它通过递增一个字符串来强制输入密码,并使用字符串分隔字符。
我以为我可以在线程之间切换" dictionnary" (字符集),但我显然是错的。
我正在做的是将 dictionnary 分成与线程一样多的部分,然后让它们处理它们的字符子集。
这是我的 dictionnary :
static const char tab[] =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789"
"!*~";
所以基本上我做了一些愚蠢的事情,因为如果我把它分成4个线程,一个人就可以测试,即" adef"但从来没有" a * 1b"。
所以我认为这是一个更好的解决方案,但是我无法真正解决它。
这是我的递增算法(还有更多的算法,但我只重视那些重要的算法):
void *func(void * bound){
char Test[5]="0000";
int u = bound + nb_pas;
for (int h = bound; h <= u; ++h){
Test[3] = tab[h];
for (int k = bound; k <= u; ++k){
Test[2] = tab[k];
for (int j = bound; j <= u; ++j){
Test[1] = tab[j];
for (int i = bound; i <= u; ++i){
Test[0] = tab[i];
if(finished == 1){
for(int r = 1 ; r < nb_thread; r++ ){
pthread_cancel(tid[r]);
}
return EXIT_SUCCESS;
}
char *hash = crypt_r(Test,salt,cdata);
if(strcmp(hash,ciphertext) == 0 ){
// Impression du résultat
printf("Password found: %s\n", Test);
printf("Hashed version of password is %s\n", hash);
printf("It took %f seconds to complete in %i steps \n", elapsed, compteur);
finished = 1;
return EXIT_SUCCESS;
}
}
}
}
}
if (finished == 0){
printf(" NO MATCH\n");
}
return 0;
}
bound
传递给与int
和(# of chars / # of threads) * thread index
对应的主题的nb_pas
(# of chars / # of threads)
我该如何处理?我想在将函数分配给线程之前模拟循环的递增,但我不知道该怎么做...
感谢您的帮助
修改
以下是我如何产生线程
for(int i = 0; i < nb_thread; i++){
int b = nb_pas*i;
if (pthread_create(&tid[i],NULL,func, b)!=0){
printf("Une erreur s'est produite");
return EXIT_FAILURE;
}
}
答案 0 :(得分:0)
您可以尝试类似
的内容for (i=0; i<nbthread; i++) {
pthread_create(......,func,i*strlen(tab)/nbthread);
}
然后:
func(void *bound) {
int start = (int)bound;
int end = start+strlen(tab)/nbthread;
for (i=start; i<end];i++) { // just one slice of the alphabet
Test[0] = tab[i];
for(j=0; j<strlen(tab); j++) { // every letter
Test[1] = tab[j];
....
}