0

我正在编写只需要整数的双哈希表。

unsigned int DoubleHashTable::HashFunction1(unsigned int const data)
{
   return (data % GetTableSize());
}

unsigned int DoubleHashTable::HashFunction2(unsigned int const data, unsigned int count)
{
   return ((HashFunction1(data) + count * (5 - (data % 5)) % GetTableSize()));
}

并尝试使用 SetData() 将数据插入表中

void DoubleHashTable::SetData(unsigned int const data)
{
   unsigned int probe = HashFunction1(data);

   if (m_table[probe].GetStatus())
   {
      unsigned int count = 1;
      while (m_table[probe].GetStatus() && count <= GetTableSize())
      {
         probe = HashFunction2(data, count);
         count++;
      }
   }

   m_table[probe].Insert(data);
}

将 100 个整数项放入大小为 100 的表中后,表显示一些索引留空。我知道,这将需要 O(N) ,这是最坏的情况。我的问题是,即使需要最坏的搜索时间,项目也应该插入没有空白空间的表中,对吗?我找不到我的功能的问题。

附加问题。有众所周知的哈希算法,双重哈希的目的是尽可能减少冲突,H2(T)是H1(T)的备份。但是,如果众所周知的哈希算法(如 MD5、SHA 等,我不是在谈论安全性,只是众所周知的算法)更快且分布良好,为什么我们需要双重哈希?

谢谢!

4

1 回答 1

1

在测试哈希函数时,可能会与某些病态输入(=破坏哈希函数的输入)发生高度冲突。这些输入可以通过反转可能导致某些攻击的哈希函数来发现(这是一个真正的问题,因为互联网路由器的哈希表空间有限)。即使没有对手,在某些输入之后这种哈希表的查找时间也会增加,甚至在最坏的情况下变成线性的。

双散列是一种解决散列冲突的方法,试图解决病态输入的线性增长问题。线性探测开放寻址是流行的选择。但是,在这些情况下,输入的数量必须远低于表大小,除非您的哈希表可以动态增长。

要回答您的第二个问题(现在您已经自己修复了代码),简而言之,双哈希更适合小型哈希表,而单哈希更适合大型哈希表。

于 2015-04-15T04:23:13.010 回答