会libnids哈希算法会发生冲突吗?

时间:2014-03-07 02:56:01

标签: algorithm hash hashmap libnids

u_int
mkhash (u_int src, u_short sport, u_int dest, u_short dport)
{
  u_int res = 0;
  int i;
  u_char data[12];
  u_int *stupid_strict_aliasing_warnings=(u_int*)data;
  *stupid_strict_aliasing_warnings = src;
  *(u_int *) (data + 4) = dest;
  *(u_short *) (data + 8) = sport;
  *(u_short *) (data + 10) = dport;
  for (i = 0; i < 12; i++)
    res = ( (res << 8) + (data[perm[i]] ^ xor[i])) % 0xff100f;
  return res;
}

这是上面的libnids哈希算法。当表大小为65536时,两个不同的tuple4可以获得相同的哈希值吗?

1 个答案:

答案 0 :(得分:3)

你有96位,你试图哈希到32位,所以在某一点发生冲突的概率是100%。

假设您的散列函数生成均匀分布的值,则生成65,536个32位散列值时发生冲突的几率非常接近50%。

我在文章Birthdays, Random Numbers, and Hash Keys中详细讨论过这个问题。它包括一个简单的公式,可以根据密钥大小和生成的哈希数来估计碰撞的可能性。