如果C#Dictionary在x86上有64位TKey会发生什么?

时间:2013-06-12 08:51:43

标签: c# dictionary hashtable

我正在从我的一个旧项目中修改一些容器类(更可重用)通用等价物。我好像多年前一直 确保TKey的{​​{1}}类型是Dictionary而不是我的容器的int类型(在这种情况下,TT)。

如果我重写这个以允许使用long,那么long类中真正发生了什么?它是否只是将64位值类型Dictionary强制哈希编码为32位int?也许是这样的:

TKey

1 个答案:

答案 0 :(得分:0)

GetHashCode方法始终返回32位int,无论您使用何种类型或系统。这就是它的重点,我不会在那里看到任何强有力的东西。毕竟,使用任何大小的任何对象或结构作为键都没有问题。 (如果他们对GetHashCode有一些有用的实现。)

字典可能最终会出现一些冲突,但只要哈希码在32位范围内均匀分布即可。

修改

所以是的,字典总是调用GetHashCode方法,即使对于int,它也很简单:

public override int GetHashCode()
{
  return this;
}

对于longint64),它看起来像这样:

public override int GetHashCode()
{
  return (int) this ^ (int) (this >> 32);
}