-
-
[讨论]请问这个字符串hash算法有名字吗
-
发表于: 2013-5-24 17:58 5718
-
两年前研究一个游戏里字符串的hash计算方法逆向出来的,一直不知道有没有名字,特来咨询。逆向还原得到的算法如下:
DWORD hash(const char * string, unsigned int length, DWORD seed)
{
char str[MAX_PATH] = {0};
char *pstr = str;
strcpy_s(pstr,MAX_PATH,string);
unsigned int lengtToHandle = length;
DWORD x = 0;
DWORD y = 0;
DWORD z = 0;
x = length + seed - 0x21524111;
y = length + seed - 0x21524111;
z = length + seed - 0x21524111;
while (*pstr != 0)
{
if (*pstr == '\\')
*pstr = '/';
pstr++;
}
pstr = str;
while(lengtToHandle > 0xC)
{
x += *pstr << 0x18;
x += *(pstr + 0x1) << 0x10;
x += *(pstr + 0x2) << 0x8;
x += *(pstr + 0x3);
y += *(pstr + 0x4) << 0x18;
y += *(pstr + 0x5) << 0x10;
y += *(pstr + 0x6) << 0x8;
y += *(pstr + 0x7);
z += *(pstr + 0x8) << 0x18;
z += *(pstr + 0x9) << 0x10;
z += *(pstr + 0xA) << 0x8;
z += *(pstr + 0xB);
x -= z;
x = ((z << 0x4) | (z >> 0x1C)) ^ x;
z += y;
y -= x;
y = ((x << 0x6) | (x >> 0x1A)) ^ y;
x += z;
z -= y;
z = ((y << 0x8) | (y >> 0x18)) ^ z;
y += x;
x -= z;
x = ((z << 0x10) | (z >> 0x10)) ^ x;
z += y;
y -= x;
y = ((x << 0x13) | (x >> 0xD)) ^ y;
x += z;
z -= y;
z = ((y << 0x4) | (y >> 0x1C)) ^ z;
y += x;
lengtToHandle -= 0xC;
pstr += 0xC;
}
switch(lengtToHandle)
{
case 0xC:
z += *(pstr + 0xB);
case 0xB:
z += *(pstr + 0xA) << 0x8;
case 0xA:
z += *(pstr + 0x9) << 0x10;
case 0x9:
z += *(pstr + 0x8) << 0x18;
case 0x8:
y += *(pstr + 0x7);
case 0x7:
y += *(pstr + 0x6) << 0x8;
case 0x6:
y += *(pstr + 0x5) << 0x10;
case 0x5:
y += *(pstr + 0x4) << 0x18;
case 0x4:
x += *(pstr + 0x3);
case 0x3:
x += *(pstr + 0x2) << 8;
case 0x2:
x += *(pstr + 0x1) << 0x10;
case 0x1:
x += *pstr << 0x18;
}
z = z ^ y;
z = z - ((y << 0xE) | (y >> 0x12));
x = x ^ z;
x = x - ((z << 0xB) | (z >> 0x15));
y = y ^ x;
y = y - ((x << 0x19) | (x >> 0x7));
z = z ^ y;
z = z - ((y << 0x10) | (y >> 0x10));
x = x ^ z;
x = x - ((z << 0x4) | (z >> 0x1C));
y = y ^ x;
y = y - ((x << 0xE) | (x >> 0x12));
z = z ^ y;
z = z - ((y << 0x18) | (y >> 0x8));
return z;
}
DWORD hash(const char * string, unsigned int length, DWORD seed)
{
char str[MAX_PATH] = {0};
char *pstr = str;
strcpy_s(pstr,MAX_PATH,string);
unsigned int lengtToHandle = length;
DWORD x = 0;
DWORD y = 0;
DWORD z = 0;
x = length + seed - 0x21524111;
y = length + seed - 0x21524111;
z = length + seed - 0x21524111;
while (*pstr != 0)
{
if (*pstr == '\\')
*pstr = '/';
pstr++;
}
pstr = str;
while(lengtToHandle > 0xC)
{
x += *pstr << 0x18;
x += *(pstr + 0x1) << 0x10;
x += *(pstr + 0x2) << 0x8;
x += *(pstr + 0x3);
y += *(pstr + 0x4) << 0x18;
y += *(pstr + 0x5) << 0x10;
y += *(pstr + 0x6) << 0x8;
y += *(pstr + 0x7);
z += *(pstr + 0x8) << 0x18;
z += *(pstr + 0x9) << 0x10;
z += *(pstr + 0xA) << 0x8;
z += *(pstr + 0xB);
x -= z;
x = ((z << 0x4) | (z >> 0x1C)) ^ x;
z += y;
y -= x;
y = ((x << 0x6) | (x >> 0x1A)) ^ y;
x += z;
z -= y;
z = ((y << 0x8) | (y >> 0x18)) ^ z;
y += x;
x -= z;
x = ((z << 0x10) | (z >> 0x10)) ^ x;
z += y;
y -= x;
y = ((x << 0x13) | (x >> 0xD)) ^ y;
x += z;
z -= y;
z = ((y << 0x4) | (y >> 0x1C)) ^ z;
y += x;
lengtToHandle -= 0xC;
pstr += 0xC;
}
switch(lengtToHandle)
{
case 0xC:
z += *(pstr + 0xB);
case 0xB:
z += *(pstr + 0xA) << 0x8;
case 0xA:
z += *(pstr + 0x9) << 0x10;
case 0x9:
z += *(pstr + 0x8) << 0x18;
case 0x8:
y += *(pstr + 0x7);
case 0x7:
y += *(pstr + 0x6) << 0x8;
case 0x6:
y += *(pstr + 0x5) << 0x10;
case 0x5:
y += *(pstr + 0x4) << 0x18;
case 0x4:
x += *(pstr + 0x3);
case 0x3:
x += *(pstr + 0x2) << 8;
case 0x2:
x += *(pstr + 0x1) << 0x10;
case 0x1:
x += *pstr << 0x18;
}
z = z ^ y;
z = z - ((y << 0xE) | (y >> 0x12));
x = x ^ z;
x = x - ((z << 0xB) | (z >> 0x15));
y = y ^ x;
y = y - ((x << 0x19) | (x >> 0x7));
z = z ^ y;
z = z - ((y << 0x10) | (y >> 0x10));
x = x ^ z;
x = x - ((z << 0x4) | (z >> 0x1C));
y = y ^ x;
y = y - ((x << 0xE) | (x >> 0x12));
z = z ^ y;
z = z - ((y << 0x18) | (y >> 0x8));
return z;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: