C/C++ 基于对勾函数和双曲线实现高效率散列函数,实现真正意义上的减少冲突!!
本散列函数基于对勾函数和双曲线函数实现。
对勾函数图像:
散列函数分析
通过以上两个函数我们可以制造一个散列函数,符合x2/a2 - y2/b2=1,且a,b值相同。
在下面的代码中,我们将会假设a的值为1,b的值为2,且我们要使用散列表,将待操作数43传入其中并获得其索引,可以得到y = sqrt(b2*x2/a2-b2)
然后将y的值作为x传入对勾函数解得索引值为85.这里我们直接遵循C语言中的截断原则,对带有小数点的值直接截断,也就是取其下界。
代码:
#include <iostream>
#include <cmath>
using namespace std;
class Hex_Function
{
private:
long a;
long b;
public:
Hex_Function(int value1, int value2) {
a = value1;
b = value2;
}
long Create_Hyperbola_function(long value)
{
return sqrt(((pow(b, 2)*pow(value, 2)) / pow(a, 2)) - pow(b, 2));
}
long Get_Ticking_function(long value)
{
return (value*a) + (b / value);
}
};
int main()
{
Hex_Function* one = new Hex_Function(1,2);
cout <<"散列值:"<< one->Get_Ticking_function(one->Create_Hyperbola_function(43));
return 0;
}
设计思想:
-
- 尽量减少a和b的差的绝对值。
- 令a的值尽可能小于b的绝对值。
- 取上界和取下界操作对函数没有过大的影响。所以为了简单起见我们直接使用取下届操作。
- 所有操作都是基于a和b大于0的情况,且a和b应该同号,否则就要考虑到要对散列结果进行取绝对值操作。或者就是按照int最大取值范围进行模运算。
- a和b的取值应根据散列表大小动态定义。
- 由于取下界操作影响,总存在一个零界点X使得散列值为0,超过该零界点,散列函数失效。