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

…………

posted @ 2012-04-12 18:09  mtry  阅读(397)  评论(0)    收藏  举报