関数をデバッグしています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;
}