仔细分析算法还可以发现这是一个数列
base =====>为namehash
char buffer[9] = {0};
unsigned int namehash = base;
for (int i=0; i<8; i++)
{
buffer[i] = (namehash>>(i+1))&0x1;
}
buffer[8] = 1;
int nseqidlen;
char seqid[31];
byte nowbyte;
for (i=0; i<nseqidlen; i++)
{
nowbyte = seqid[i];
int t1 = (namehash>>(i%31))%10;
int tem1 = (t1 + nowbyte -0x30)%10;
if (tem1==1)
{
buffer[0] ^= 1;
continue;
}
if (buffer[tem1-2]!=1)
{
error;
}
if (tem1-2>=1)
{
for (i=0; i<tem1-2; i++)
{
if (buffer[i] == 1)
{
error;
}
}
}
buffer[tem1-1] ^= 1;
}
通过对tem1 的一系列取值,可以达到对其中一位进行反位的功能,前提是这一位前面都为0.
这个取值是一个数列
让第1位反位 1
让第2位反位 1 2 1
让第3位反位 1 2 1 3 1 2 1
让第4位反位 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
通项式是 f(n) = f(n-1)+n+f(n-1);f(1)=1;
int count;
void get_reserve_string(int num, char *buffer)
{
if (num==1)
{
sprintf(buffer+count, "%1d", 1);
count++;
return;
}
get_reserve_string(num-1, buffer);
sprintf(buffer+count, "%1d", num);
count++;
get_reserve_string(num-1, buffer);
return;
}
用来生成这个数列.
//这里用的是最正常的办法,没有优化!!!! 对buffer中每一个1进行反位
for (i=0; i<9; i++)
{
if (buffer[i]==1)
{
memset(stringbuffer, 0, 520);
count = 0;//全局置0
get_reserve_string(i+1, stringbuffer);
for (int j =0; j<count; j++)
{
t1 = (namehash>>((key_cur+j)%31))%10;
if (t1 <= (stringbuffer[j]-0x30))
{
key[key_cur+j] = stringbuffer[j] - t1;
}
else
key[key_cur+j] = 10 + stringbuffer[j] - t1;
}
key_cur += count;
}
}
唉,我当时注册的时候,是12点以前,但是老是注册不成功,没有办法,运气不好,祝福你们拉
ps
sar就是带符号的右移,定义成int就可以了,如果是shr的话,定义为unsigned int
