template<typenameKey,typenameValue,typenameHasher>classHashMap{private:
Hasher hash;public:voidadd(const Key & k,const Value & v){unsignedint h =hash(k);//...everything else elided}};
2 Collision Resolution
collision --> mod后产生相同的index
2.1 Chaining
使用chaining——maintain一个链表数组。链表中的每个节点都拥有一个键/值对(for a map,or just the item for a set)
//implement a maptemplate<typenameKey,typenameValue,typenameHasher>classHashMap{private:
Hasher hash;
vector<list<pair<Key, Value>>> table;public:voidadd(const Key & k,const Value & v){unsignedint h =hash(k);
h = h % table.size();
table[h].push_front(pair<Key, Value>(k, v));}};
unsignedhash(const std::string & str){unsigned ans =0;for(std::string::const_iterator it = str.begin();it != str.end();++it){
ans +=*it;}return ans;}
把每个字母对应的数字相加,有无数重复
3.2 A Better Hash Function for Strings
unsignedhash(const std::string & str){unsigned ans =0;for(std::string::const_iterator it = str.begin();it != str.end();++it){
ans = ans *29+*it;}return ans;}
29是质数且比26大(小写字母a-z对应1-26)
最终table的bucket数也比第一种大很多
3.3 Cryptographic Hash Functions 加密哈希函数
很难产生重复
3.4 Hash Function Objects
write by our own
classStringHasher{private:constint multiplyBy;public:StringHasher():multiplyBy(29){}StringHasher(int m):multiplyBy(m){}unsignedoperator()(const std::string & str)const{unsigned ans =0;for(std::string::const_iterator it = str.begin(); it!=str.end();++it){
ans = ans * multiplyBy +*it;}return ans;}};
Chap23 Hash Tables1 Hash Table Basics2 Collision Resolution2.1 Chaining2.2 Open Addressing3 Hashing Functions3.1 A Bad Hash Function for Strings3.2 A Better Hash Function for Strings3.3 Cryptographic Hash Functions 加密哈希函数3.4 Hash Function Objects4 Rehashin