我正在使用(更可重用的)通用等价物从我的一个旧项目中重新设计一些容器类。几年前,我似乎已经竭尽全力确保TKeyfor 的类型Dictionary是 anint而不是我的容器的T类型(在这种情况下T是long)。
如果我重写它以允许long使用,那么在Dictionary课堂上到底发生了什么?它会强制将 64 位值类型哈希编码TKey为 32 位 int 吗?也许是这样的:
int hashKey32bit = tkey.GetHashCode();
我正在使用(更可重用的)通用等价物从我的一个旧项目中重新设计一些容器类。几年前,我似乎已经竭尽全力确保TKeyfor 的类型Dictionary是 anint而不是我的容器的T类型(在这种情况下T是long)。
如果我重写它以允许long使用,那么在Dictionary课堂上到底发生了什么?它会强制将 64 位值类型哈希编码TKey为 32 位 int 吗?也许是这样的:
int hashKey32bit = tkey.GetHashCode();
无论您在什么类型或系统上调用该方法,该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);
}