我正在为此范围内的商店元素执行哈希表:2000000-20000000的值。
例子: 17664658-8,7587458-8,7338375-4,5741259-2 .....
在100000个元素的样本中,碰撞的数量约为23939,在1000000个元素的样本中,碰撞的数量约为439870.我对哈希表知之甚少,但这个数量的碰撞并不是很少高?
我读到在一个受控制的数字范围内,你可以有一个相当统一的好哈希函数,但不知道如何或从哪里开始,任何建议?
这是我的哈希函数。
int hash(char* clave,int m) { //m is the size of the table (about the double of the elements to be stored)
int number=0,i=0;
///
while(isdigit(clave[i])){ //i don't use the last 2 characters.
number+=(clave[i++]-'0');
if(isdigit(clave[i]))
number*=10;
}
/// mutiplication method
float dis,R;
R=0.6106154;
dis = R*(number) - floor(R*(number));
int result = (int)(dis*m);
return result;
}
答案 0 :(得分:3)
不,碰撞的次数不是太多,实际上它与你的期望有关。具有统一随机散列函数和m个桶和n个插入的expected number of collisions in a hash table的公式为:
n - m * (1 - ((m-1)/m)^n)
对于你的情况:
m = 178144
n = 100000
插入数字给出:
100000 - 178144 * (1 - ((178144-1)/178144) ^ 100000)
= 23476.674
并且观察到的冲突次数是23939.因此您的哈希函数没有任何问题。