常见的哈希函数

原理参考《算法导论》

一、除法散列函数

根据描述实现算法,先取对应种子

int hash_mod_seed(int n, int iCheck) {//存放n个关键字,一次不成功的查找要检查iCheck个关键字,默认一个字符是8位
    int iStart= n / iCheck, prime = (iStart == 1) ? 2 : iStart;
    assert(iCheck >= 0 && iCheck <= 8);
    //odd起始要跳过已经判断了的奇数
    for (int j = 0, odd = (iStart % 2 == 0) ? iStart / 2 : (iStart - 1) / 2 + 1;
        j < 8 - iCheck; odd++) {
        //生成一个素数
        bool fPrime = true;
        for (int k = 2; k <= sqrt(prime); k++)
            if (prime % k == 0) {
                fPrime = false;
                break;
            }
        if (fPrime) //记录素数
            j++;
        prime = odd * 2 + 1;//待判断的奇数
    }
    return prime - 2;
}

关键算法实现

int hash_mod(int key, int seed) {
    return key % seed;
}

二、乘法散列函数

根据算法描述实现

int hash_mul(int key, int w, int p) {//w指关键字int是32位,p是映射后截取的最高有效位
    __int64 s = (sqrt(5) - 1) / 2 * pow(2, w);
    __int64 r0 = s*key % (int)pow(2, w);
    return r0 / pow(2, w - p);//高p位有效位
}

所有代码均经过测试,结果正确

猜你喜欢

转载自www.cnblogs.com/dalgleish/p/8914417.html