Hash根据我的理解就是将一串字符或一串数字经过hash函数的处理后
得以储存下来使得后面的查找方便又快捷,是一种用空间换时间的方式。
常用的hash函数:可以将key值或它的取余(通常用质数),如果实现知
道数据的格式的话可以进行分析,还有平方求和法和折叠法。
如果是字符串的话可以使用BKDRHash函数
unsigned int do_hash(char a[]){
unsigned int seed=131;
unsigned int hash=0;
int t=0;
for(char i=a[t];i!='\0';i=a[t]){
hash=hash*seed+i;
t++;
}
return hash%mod;
}
如果是全排列可以用康托展开 : http://blog.youkuaiyun.com/zhongkeli/article/details/6966805
当然,大多数的Hash函数都会造成不可避免的冲突,即do_hash(a)=do_hash(b);这时可以
用开放地址法和拉链法避免冲突所带来的影响。
开放地址法: http://blog.youkuaiyun.com/w_fenghui/article/details/2010387
拉链法类似于图的邻接链表,在同一hash[ ]下开多个单位格储存冲突,查找则是一一查找。