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

时间:2014-02-28 13:30:08

标签: hash hash-collision

我创建了一个简单的哈希函数(如果它可以被称为一个),它将字符串转换为double。

它的工作原理是取第一个字符的值并将其转换为double,然后将其乘以下一个字符的余弦,然后乘以下一个字符的余弦,依此类推......

这是功能:

double hash (string str) {
    double hash = (double)str[0];

    for (int i = 1; i < str.length(); i++) {
        hash *= cos((double)str[i]);
    }

    return hash;
}

那么如何计算此函数中碰撞的概率?

我发现一个公式为1 - e ^(k(k-1)/(2k)),但是从我读到的它只有在哈希函数是一个好的函数时才有效(它会均匀地分配哈希值,就像一个好的RNG,或类似的东西)。

1 个答案:

答案 0 :(得分:1)

使用浮点数学来计算字符串的散列似乎有点矫枉过正。您的公式至少有一个问题是相同字符串的排列会导致冲突,因为乘法是可交换的。

在您的情况hash('abc') = (cos('a') * cos('b')) * cos('c')中,它等于hash('cab') = (cos('c') * cos('a')) * cos('b'),但可能存在一些小的浮点错误。