字符串处理:
unix的ELF哈希函数
unsigned int ELFHash(char* str){ unsigned int hash = 0; unsigned int x = 0; while (*str){ hash = (hash << 4) + (*str++); if ((x = hash & 0xF0000000L) != 0){ hash ^= (x >> 24); hash &= ~x; } } return (hash & 0x7FFFFFFF);}
BKDRHash 哈希
unsigned int BKDRHash(char * str) { unsigned int seed = 31;//31 131 1313 13131 unsigned int key = 0; while (*str) key = key*seed+ *str++; return key&(0x7fffffff); }
开散列:
挂链实现:
void Gua(int tmp){ int tp = tmp%N; if (tp < 0) tp = -tp; node *t = &H[pos++]; t->num = tmp; t->next = tagp[tp]; tagp[tp] = t;}int Cha(int tmp){ int tp = tmp%N; if (tp < 0) tp = -tp; node *q; int count = 0; for (q = tagp[tp]; q != NULL; q = q->next){ if (q->num == tmp) count++; } return count;}
vector<>实现:
vector hash[N];void Gua(int tmp){ int tp = tmp%N; if (tp < 0) tp = -tp; hash[tp].push_back(tmp);}int Cha(int tmp){ int tp = tmp%N; if (tp < 0) tp = -tp; int count = 0,k; int sz = hash[tp].size(); for (k = 0; k < sz; ++k){ if (hash[tp][k] == tmp) count++; } return count;}