哈希表中的冲突数

时间:2015-03-21 05:45:37

标签: c hash

我正在为此范围内的商店元素执行哈希表: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;
    }

1 个答案:

答案 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.因此您的哈希函数没有任何问题。