hash--BKDRHASH算法

一种非常优秀的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;
}

未解决的问题

文章目录
  1. 1. 学习的来源
  2. 2. 代码
  3. 3. 冲突测试代码
  4. 4. 未解决的问题
{{ live2d() }}