技术开发 频道

密码生成算法

  【IT168 文档

  在运用cuda进行md5crack的时候,遇到一个问题,既cuda是并行的,他不向cpu那样会一句一句的执行。因此在执行过程中有用的线程在当前grid中的索引就显得很重要,那为我们生成md5的字典起到了非常重要的作用。

  但是,也因为他的串行,很多事情不像cpu那样方便了,因为我们必须从gpu的角度去看问题。现在就让我们看一下具体的问题。

  在这个运算的过程中,比如我们传给gpu的起始字符串是abcd,然后线程索引是123,我们就要得到当前线程应该跑的密码是那个呢?不能直接去算吧?好,那我换个思路来想。如果我把abcd看成是一个数组,对应的数组的值是1 2 3 4 那不是好解决了嘛 1234+123肯定很简单吧。。。

  下面就是我测试程序

#include<stdio.h>

const int base = 10;//这里模拟整个字符串的长度
int main(){
int index[5]={0};//模拟传递进来的起始字符串
int k;
for ( k = 0;k<5;k++)
{
  printf(
"please input number %d :/>",k);
  scanf(
"%d",&index[k]);
}
int numner;//模拟当前线程索引
printf("please input number you want add : \>");
scanf(
"%d",&numner);

int ii=0;

while(++ii<5)
{
  
if (numner<base)//判断线程索引是否大于基本字符串的长度
  {
  
if (index[ii]+numner<base)//小于,则判断当前位置的值+numner过后是否大于字符串长度。既十进制中的判断是否有进位
   {
    index[ii]
=index[ii]+numner;//赋新值
   }
  
else
   {
    index[ii]
= (index[ii]+numner%base)%base;//形如9+8=17那么个位的值就是7
    index[ii+1]++;//进位
   }
  }
  
else
  {
  
if (index[ii]+numner%base>=base)//判断是否会存在进位
   {
    index[ii
+1]++;//有进位,加一
   }
   index[ii]
=(index[ii]+numner)%base; //同前一个else的值。
  }
  numner
=numner/base;//下一轮循环前,先移位,十进制中的算法
}
}

   但是这个算法还有很多不足,比如复杂度等,如果有哪位高手能帮改进 先谢了

0
相关文章