原理参考《算法导论》
一、除法散列函数
根据描述实现算法,先取对应种子
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位有效位 }
所有代码均经过测试,结果正确