【问题标题】:How to compute for collisions on this hash function?如何计算此哈希函数上的冲突?
【发布时间】:2014-02-28 13:30:08
【问题描述】:

我做了一个简单的散列函数(如果它可以被称为一个),它将一个字符串转换为一个双精度。

它的工作原理是取第一个字符的值并将其转换为 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,或者类似的东西)。

【问题讨论】:

    标签: hash hash-collision


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2010-10-15
      • 2019-03-25
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多