【问题标题】:will libnids hash algorithm get a conflict?libnids 哈希算法会发生冲突吗?
【发布时间】:2014-04-10 00:54:14
【问题描述】:
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能否得到相同的hash值?

【问题讨论】:

  • 输入大小大于哈希值,所以是的,通过pidgeonhole principle你的哈希函数不能是单射的

标签: algorithm hash hashmap libnids


【解决方案1】:

您尝试将 96 位哈希为 32 位,因此在某个点发生冲突的概率为 100%。

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

我在我的文章Birthdays, Random Numbers, and Hash Keys 中详细讨论了这个问题。它包括对一个简单公式的引用,该公式可以在给定密钥大小和生成的散列数的情况下估计冲突的可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2011-01-21
    • 2014-02-24
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    相关资源
    最近更新 更多