5.散列-字符串hash

1. 只有大写字母

/* 1. 只适用于所有大写字母 且 字符串不能太长 */
#include <bits/stdc++.h>
using namespace std;
int hashlist(char s[],int len)
{
	int id=0;
	for(int i=0;i<len;i++)
	{
		id=id*26+(s[i]-'A');  //将26进制转换至10进制 
	}
	return id; 
}
int main()
{
	char a[7]="xingly";
	cout<<hashlist(a,6);
	return 0;
}

2. 只有大写字母+小写字母

/* 2.只适用于大写小写字母 且 字符串不能太长 */
#include <bits/stdc++.h>
using namespace std;
int hashlist(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');  //将26进制转换至10进制 
		else if(s[i]>='a'&&s[i]<='z') id=id*52+(s[i]-'a')+26;  
	}
	return id; 
}
int main()
{
	char a[7]="xinglZ";
	cout<<hashlist(a,6);
	return 0;
}

3. 只有大写字母+小写字母+数字[只有一个数字且在最后一位]——极易溢出

/* 3.适用于大小写字母+数字[数字确定在最后一位,且只有一个数字] *强烈建议不要使用 极易溢出 */
#include <bits/stdc++.h>
using namespace std;
int hashlist(char s[],int len)
{
	int id=0;
	for(int i=0;i<len-1;i++)
	{
		if(s[i]>='A'&&s[i]<='Z')  id=id*52+(s[i]-'A');  //将26进制转换至10进制 
		else if(s[i]>='a'&&s[i]<='z') id=id*52+(s[i]-'a')+26;  
	}
	id=id*10+(s[len-1]-'0'); 
	return id; 
}
int main()
{
	char a[5]="xil6";
	cout<<hashlist(a,4);
	return 0;
}

4. 只有大写字母+小写字母+数字[任意位置]——个人推荐

/* 4.适用于大小写字母+数字[数字可在任意位置,任意数量] */
#include <bits/stdc++.h>
using namespace std;
int hashlist(char s[],int len)
{
	int id=0;
	for(int i=0;i<len-1;i++)
	{
		if(s[i]>='A'&&s[i]<='Z')  id=id*62+(s[i]-'A');  //将26进制转换至10进制 
		else if(s[i]>='a'&&s[i]<='z') id=id*62+(s[i]-'a')+26;  
		else if(isdigit(s[i])) id=id*62;
	}
	return id; 
}
int main()
{
	char a[5]="xil6";
	cout<<hashlist(a,4);
	return 0;
}


TIP:个人推荐 1、2、4方法