如果c#字典在x86上有64位TKey会发生什么?

本文关键字:什么 TKey 64位 字典 x86 上有 如果 | 更新日期: 2023-09-27 18:17:55

我正在用(可重用得多的)泛型等价物重新设计我的一个旧项目中的一些容器类。几年前,我似乎已经离开了我的方式,以确保DictionaryTKey类型是int而不是我的容器的T类型(在这种情况下,Tlong)。

如果我重写这个以允许使用long,在Dictionary类中实际发生了什么?它只是强制将64位值类型TKey哈希编码为32位整型吗?也许像这样:

int hashKey32bit = tkey.GetHashCode();

如果c#字典在x86上有64位TKey会发生什么?

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

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

编辑

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

public override int GetHashCode()
{
  return this;
}

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

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