hash
一、hash函数基础1
1、一个简单的hash函数:
/*
key为一个字符串,nTableLength为哈希表的长度
该函数得到的hash值分布比较均匀
*/
long long getHashIndex( char *key, long long nTableLength )
{
long long nHash = 0;
while (*key)
{
nHash = (nHash<<5) + nHash + *key++;
}
return ( nHash % nTableLength );
}
2、一个完整测试程序:
哈希表的数组是定长的,如果太大,则浪费,如果太小,体现不出效率。合适的数组大小是哈希表的性能的关键。哈希表的尺寸最好是一个质数。当然,根据不同的数据量,会有不同的哈希表的大小。对于数据量时多时少的应用,最好的设计是使用动态可变尺寸的哈希表,那么如果你发现哈希表尺寸太小了,比如其中的元素是哈希表尺寸的2倍时,我们就需要扩大哈希表尺寸,一般是扩大一倍。
下面是哈希表尺寸大小的可能取值:
17, 37, 79, 163, 331,
673, 1361, 2729, 5471, 10949,
21911, 43853, 87719, 175447, 350899,
701819, 1403641, 2807303, 5614657, 11229331,
22458671, 44917381, 89834777, 179669557, 359339171,
718678369, 1437356741, 2147483647
hash函数基础1 为截取内容,作者和出处如下:
作者:July、wuliming、pkuoliver
出处:http://blog.csdn.net/v_JULY_v。
二、hash函数基础2
全排列hash(1 到 9 之间的全排列)
View Code
void init_fact() { int i; fact[0]=1; for(i=1;i<=8;i++) fact[i]=fact[i-1]*i; } int gethash(string s)//全排列hash { int cnt,h,i,j; h=0; for(i=1;i<9;i++) { cnt=0; for(j=0;j<i;j++) { if(s[j]>s[i]) cnt++; } h+=cnt*fact[i]; } return h; }
三、hash函数基础3
…………


浙公网安备 33010602011771号