为什么“int”和“sbyte”GetHashCode函数会生成不同的值?

我们有以下代码:

int i = 1; Console.WriteLine(i.GetHashCode()); // outputs => 1 

除了sbyte和short之外,C#中的所有整数类型都是有意义的。 那是:

 sbyte i = 1; Console.WriteLine(i.GetHashCode()); // outputs => 257 

为什么是这样?

因为该方法的来源( SByte.GetHashCode )是

 public override int GetHashCode() { return (int)this ^ ((int)this << 8); } 

至于为什么,微软有人知道......

是的,这都是关于价值分配的。 由于GetHashCode方法的返回类型是类型为sbyte的int,因此值将以257的间隔分布。对于long类型,同样的原因将是colisions。

原因是可能是为了避免哈希值的聚类。

正如GetHashCode 文档所说:

为获得最佳性能,哈希函数必须为所有输入生成随机分布。 在类上提供良好的散列函数会显着影响将这些对象添加到散列表的性能。 在具有良好的散列函数实现的散列表中,搜索元素需要恒定的时间(例如,O(1)操作)。

此外,正如这篇优秀文章所解释的:

准则:哈希码的分布必须是“随机的”通过“随机分布”,我的意思是如果被哈希的对象中存在共性,则在所产生的哈希码中不应存在类似的共性。 例如,假设您正在散列一个表示点的纬度和经度的对象。 一组这样的位置极有可能被“聚集”; 例如,你的位置大多数位于同一个城市的房屋,或者大多数是同一油田的阀门,或者其他什么,这样的可能性很大。 如果群集数据产生群集哈希值,则可能会减少使用的桶数,并在桶变得非常大时导致性能问题。