適合中文關鍵字的哈希函數

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函數列表

https://www.byvoid.com/blog/string-hash-compare/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章