我如何计算此哈希函数中的冲突?

时间:2011-12-05 23:41:39

标签: c++ hash prefix hash-collision

这是一个前缀哈希函数。我想计算这种方法中的碰撞次数,但我不知道该怎么做。看起来它可能很简单,但我不能想到一个很好的方法来做它....

int HashTable_qp::preHash(string & key, int tableSize )
{
    string pad = "AA";
    //some words in the input are less than 3 letters
    //I choose to pad the string with A because all padded characters 
    //have same ascii val, which is low, and will hopefully alter the results less
    if (key.length() < 3)
    {
        key.append(pad);
    }
    return ( key[0] + 27 * key[1] + 729 * key[2] ) % tableSize;
}

3 个答案:

答案 0 :(得分:1)

如果是基础数据结构的数组: int hash = preHash(&key, array.length); if(array[hash] != null) this.count++; 如果它是一系列链表,请执行:

if(array[hash] != null && *(array[hash]) != null)
this.count++

如果您只能访问stl库,我相信只测试该元素为null 在调用哈希函数之后添加它就足够了。

答案 1 :(得分:1)

创建直方图:

 unsigned histogram[tablesize] = {0};

生成一些(所有)可能的字符串并计算其hashval,并相应地更新直方图:

for(iter=0; iter < somevalue; iter++) {
 hashval = hashfunc( string.iterate(iter) ); // I don't know c++
 histogram[hashval] +=1;
 }

现在你必须分析块/簇的哈希表。经验法则是,对于(tablesize==iter),您期望大约30%的单元格具有count = 1,并且大约30%的单元格为空;其余的有两个或更多。

如果你将所有(count*(count+1))/2求和,并除以表格大小,你应该期望大约1.5。一个坏的散列函数给出了更高的值,一个完美的散列只有count = 1的单元格(因此:ratio = 1)对于线性探测,你当然不应该使用tablesize = niter,但要使tableize更大,比如说大两倍。但是,您可以使用相同的度量标准(探测次数/条目数)来分析其性能。

更新:关于哈希函数及其性能的精彩介绍可以在http://www.strchr.com/hash_functions找到。

答案 2 :(得分:0)

您可以创建一个整数数组,每个整数表示一个哈希值。当你完成哈希循环遍历数组的嵌套循环。如果你有以下数组,

[0] -> 13
[1] -> 5
[2] -> 12
[3] -> 7
[4] -> 5

对于 0..n 中的每个项目,请检查项目 i + 1..n 以查找匹配项。用英语表示:检查每个元素是否等于之后的任何元素