一种非常优秀的hash算法
学习的来源
初步的解释hash
BKDR-hash性能测试
代码
1 2 3 4 5 6 7 8 9 10 11
| typedef unsigned long long ull; ull seed = 137; ull bkdr_hash(){ int len = s.length(); ull ans = 0; for (int i = 0;i < s.length();i++) ans = ans * seed + s[i]; return ans; }
|
冲突测试代码
感觉冲突的可能还是非常大的,并不知道为什么这个算法很优秀,待解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; ull seed = 137; string s; ull bkdr_hash(){ int len = s.length(); ull ans = 0; for (int i = 0;i < s.length();i++) ans = ans * seed + s[i]; return ans; } int main(){ srand((unsigned)time(NULL)); int tot = 1e5; set<ull> ss; ss.clear(); for(int i=0; i<tot; i++){ s.clear(); int len = rand()%100; for(int j=0; j<len; j++){ s += (rand()%26+'a'); } ull hash_value = bkdr_hash(); if(ss.count(hash_value)==0){ ss.insert(hash_value); } else{ cout<<"the insert number"<<i<<endl; printf("hash collision\n"); break; } } return 0; }
|
未解决的问题