【发布时间】:2011-06-04 12:38:10
【问题描述】:
我正在对一个旧游戏使用的存档文件格式进行逆向工程,发现它使用以下函数(手动反编译)对文件名进行哈希处理:
int hash(char* filename) {
unsigned int a = 0;
int b = 0;
for(int i = strlen(filename)-1; i>=0; i--)
char c = toupper(filename[i]);
a=(a<<5)+(a>>25);
b+=c;
a+=b+c;
}
return a;
}
我想知道这是什么标准,还是只是开发人员随机挑选的东西。
【问题讨论】:
-
你能告诉我们这是哪一年的比赛吗?相当现代的随机数生成函数基于相同的想法
-
它看起来类似于 Shift-Add-XOR 哈希,但有额外的添加而不是 XORing;一些现有的哈希算法见eternallyconfuzzled.com/tuts/algorithms/…
-
对我来说看起来像任何旧的拇指吸盘哈希函数。
a << 5 ^ a >> 27很常见。
标签: c reverse-engineering