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