字符串hash是指将一个字符串S映射为一个整数,使得该整数可以尽可能唯一的代表字符串S。
先假设字符串均由A~Z构成
不妨将A~Z视为0 ~ 25 这样就把26个字母对应都按二十六进制中。
#include<cstdio>
#include<cstring>
int hashFunc(char S[], int len){
int id = 0;
for(int i = 0; i < len; i++){
id = id * 26 + (S[i] - 'A');
}
return id;
}
int main(){
char str1[] = "AAB";
char str2[] = "ABA";
char str3[] = "BAA";
printf("%d\n", hashFunc(str1, strlen(str1)));
printf("%d\n", hashFunc(str2, strlen(str2)));
printf("%d\n", hashFunc(str3, strlen(str3)));
return 0;
}
显然,如果字符串S 的长度比较长,那么转换的整数会很大,因此需要注意使用的len不能太长。如果出现了小写字母,那么可以把A~Z作为0 ~ 25,而把a ~ z作为 26 ~ 51,这样就变成五十二进制转换成十进制的问题。
#include<cstdio>
#include<cstring>
int hashFunc(char S[], int len){
int id = 0;
for(int i = 0; i < len; i++){
if(S[i] >= 'A' && S[i] <= 'Z'){
id = id * 52 + (S[i] - 'A');
}else if(S[i] >= 'a' && S[i] <= 'z'){
id = id * 52 + (S[i] - 'a') + 26;
}
}
return id;
}
int main(){
char str1[] = "AAA";
char str2[] = "ABA";
char str3[] = "BAA";
char str4[] = "aaa";
char str5[] = "AAa";
char str6[] = "aba";
printf("%d\n", hashFunc(str1, strlen(str1)));
printf("%d\n", hashFunc(str2, strlen(str2)));
printf("%d\n", hashFunc(str3, strlen(str3)));
printf("%d\n", hashFunc(str4, strlen(str4)));
printf("%d\n", hashFunc(str5, strlen(str5)));
printf("%d\n", hashFunc(str6, strlen(str6)));
return 0;
}
举个栗子: