常见的hash函数

 

转自http://hi.baidu.com/aconly/blog/item/5c82eb76f70f601cb051b952.html

 

字符串的 hash (有许多现成函数,选择合适的就行)

poj 2503

int ELFhash(char *key)             

{

    unsigned long h=0;

    while(*key)

    {

        h=(h<<4)+*key++;

        unsigned long g=h&0Xf0000000L;

        if(g) h^=g>>24;

        h&=~g;

    }

    return h%MOD;

}

数组的 hash (有现成函数)

poj3274

int getkey(int *v,int k)

{

       int i,p=0;

       for(i=1; i<k; i++)

              p=((p<<2)+(v[i]>>4))^(v[i]<<10);

       p = p%prime;

       if(p<0)    p=p+prime;

       return p;

}

全排列的 hash (没有冲突的 hash, 利用全排列与逆序数列一一对应的原理)

poj1077

template <typename T>
size_t PermutationToNumber(const T permutation[], int n)
{
// n不能太大,否则会溢出(如果size_t为32位,则n <= 12)
size_t result = 0;
for (int j = 1; j < n; ++j) {//每一种排列对应一种逆序,每一种逆序对应一个结果
       int count = 0;
       for (int k = 0; k < j; ++k) {
         if (permutation[k] > permutation[j])
            ++count;
       }
       // factorials[j]保存着j!(j的阶乘)
       result += count * factorials[j];
}

return result;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值