在 .NET 中,Dictionary<string,TValue> 是否会发生键冲突

In .NET, can there be key collisions for a Dictionary<string,TValue>

我刚了解到:

这让我想到,.NET 中的字典(至少在使用字符串作为键时)容易发生键冲突。

这样的按键碰撞会发生什么?是否有任何已知的唯一字符串值实际上发生冲突?字典会根据这些键值被破坏吗?

此外:

注意:我不是指特定的.NET CLR,但如果有关系,让我们谈谈桌面版 4.5.2 32 位版本。


关于重复项的说明:

你可以很容易地产生这样的碰撞(见https://en.wikipedia.org/wiki/Birthday_problem),例如

  // key   - computed hash value
  // value - original string
  Dictionary<int, string> hashes = new Dictionary<int, string>();

  for (int i = 0; ; ++i) {
    string st = i.ToString();
    int hash = st.GetHashCode();
    string collision = null;

    if (hashes.TryGetValue(hash, out collision)) {
      Console.Write($"Collision: \"{collision}\" and \"{st}\" hash {hash}");

      break;
    }
    else
      hashes.Add(hash, st);
  }

结果(在我的工作站 .Net 4.6.1 x86):

  Collision: "699391" and "1241308" hash -1612916492

结果(在我的工作站上 .Net 4.6.1 在 IA-64 重新编译):

  Collision: "942" and "9331582" hash -1864841629

所以如果你想看到按键冲突(在 x86 模式下):

 // Both "699391" and "1241308" keys have the same hash -1612916492
 Dictionary<string, string> demo = new Dictionary<string, string>() {
   {"699391", "abc"},
   {"1241308", "def"},
 };

最后,String.GetHashCode 是 .Net 的内部工作机制,它可以依赖 .Net 版本,模式 (IA64或 x86) 等。不能保证短字符串不会发生冲突等。