我创建了一个简单的哈希函数(如果它可以被称为一个),它将字符串转换为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,或类似的东西)。
答案 0 :(得分:1)
使用浮点数学来计算字符串的散列似乎有点矫枉过正。您的公式至少有一个问题是相同字符串的排列会导致冲突,因为乘法是可交换的。
在您的情况hash('abc') = (cos('a') * cos('b')) * cos('c')
中,它等于hash('cab') = (cos('c') * cos('a')) * cos('b')
,但可能存在一些小的浮点错误。