我正在调试一个函数hashKey
。问题是它在不同平台、windows/win ce、mac os、android下对相同的输入产生不同的结果。这是代码:
unsigned long hashKey(const char *name,size_t len)
{
unsigned long h=(unsigned long)len;
size_t step = (len>>5)+1;
for(size_t i=len; i>=step; i-=step)
h = h ^ ((h<<5)+(h>>2)+(unsigned long)name[i-1]);
return h;
}
这是我使用的测试程序:
int main()
{
char word[] = { 0xE6, 0xBE, 0xB3, 0xE9, 0x96, 0x80, 0xE7, 0x89, 0xB9, 0xE5,
0x88, 0xA5, 0xE8, 0xA1, 0x8C, 0xE6, 0x94, 0xBF, 0xE5, 0x8D,
0x80, 0x2E, 0x70, 0x6E, 0x67, 0x00};
// for those who are interested in what the value of variable means, it means
// "澳門特別行政區.png"
unsigned int val = hashKey(word, strlen(word));
printf("hash key for [%s] is [%d].\n", word, (unsigned int)val);
}
长度为25,输入值相同,但返回值不同:
在android中是648,在win ce中是96,就是期望值。
我不知道为什么。任何帮助表示赞赏。提前致谢!
更多信息:
不同的值在循环中的几次交互后开始,由
h>>2
. 所以一开始,价值观是一样的。似乎输入 ansi 字符没有这样的问题。
2013 年 5 月 3 日解决(感谢 Yojimbo 的建议)。
unsigned long hashKey(const char *name,size_t len)
{
unsigned long h=(unsigned long)len;
size_t step = (len>>5)+1;
for(size_t i=len; i>=step; i-=step)
{
unsigned long charVal = (unsigned long)name[i-1];
if (charVal >= 0x00000080)
charVal = charVal | 0xffffff80;
h = h ^ ((h<<5 & 0xffffffe0)+(h>>2 & 0x3fffffff) + charVal);
}
return h;
}