1

我正在使用(更可重用的)通用等价物从我的一个旧项目中重新设计一些容器类。几年前,我似乎已经竭尽全力确保TKeyfor 的类型Dictionary是 anint而不是我的容器的T类型(在这种情况下Tlong)。

如果我重写它以允许long使用,那么在Dictionary课堂上到底发生了什么?它会强制将 64 位值类型哈希编码TKey为 32 位 int 吗?也许是这样的:

int hashKey32bit = tkey.GetHashCode();
4

1 回答 1

1

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

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

编辑

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

public override int GetHashCode()
{
  return this;
}

对于long( int64) 它看起来像这样:

public override int GetHashCode()
{
  return (int) this ^ (int) (this >> 32);
}
于 2013-06-12T09:07:43.240 回答