int GetHashTablePos(char *lpszString, MPQHASHTABLE *lpTable, int nTableSize)
{
const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;
int nHash = HashString(lpszString, HASH_OFFSET);
int nHashA = HashString(lpszString, HASH_A);
int nHashB = HashString(lpszString, HASH_B);
int nHashStart = nHash % nTableSize, nHashPos = nHashStart;
while (lpTable[nHashPos].bExists)
{ //比較的是Table中存儲的另外兩個Hash函數的值,Table中不存儲字符串
if (lpTable[nHashPos].nHashA == nHashA && lpTable[nHashPos].nHashB == nHashB)
return nHashPos;
else //衝突處理
nHashPos = (nHashPos + 1) % nTableSize;
if (nHashPos == nHashStart)
break;
}
return -1; //Error value
}
暴雪hash解決衝突的方法與我們常用的用鏈表解決的思路不太一樣,而是在table不存儲字符串,存儲另外兩個hash的值,如果查看哈希表位置的時候那兩個hash的值也匹配,
則表示找到了字符串