hash函數的策略。
對於GB2312編碼,設輸入的漢字爲GBword,我們可以採用公式(C1-176)*94 + (C2-161)確定GBindex。其中,C1表示第一字節,C2表示第二字節。具體如下:
GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;
之所以用unsigned char類型,是因爲char是一個字節,如果用unsigend int,因爲int是4個字節的,所以會造成擴展,導致錯誤。
對於GBK編碼,設輸入的漢字爲GBKword,則可以採用公式 index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字節,ch2是第二字節。
具體的,
GBKindex = ((unsigned char)GBKword[0]-129)*190 + ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;
哈希表的性能很大程度上取決於一個哈希函數的好壞。我用單個漢字作爲key,5702個漢字衝突率爲0,quite impressive。
例如一個 對單個GBK漢字的哈希函數可以這麼寫:
struct hash_CHGBK{
size_t operator()(const char* GBKword) const{
size_t GBKindex;
GBKindex = ((unsigned char)GBKword[0]-129)*190 +
((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;
}
};
加上一個比較的函數:
struct eqstr
{
bool operator()(const char* s1, const char* s2)const{
return strcmp(s1, s2)==0;
};
};
可以這麼用
hash_map<const char*, int, hash_CHGBK, eqstr> CHGBK_hashmap;
原帖地址:http://www.iteye.com/problems/60530
原帖作者:deepfuture
hash函數列表