我们有以下代码:
int i = 1;
Console.WriteLine(i.GetHashCode()); // outputs => 1
除了sbyte和short之外,C#中的所有整数类型都是有意义的。 那就是:
sbyte i = 1;
Console.WriteLine(i.GetHashCode()); // outputs => 257
为什么会这样?
答案 0 :(得分:5)
因为该方法的来源(SByte.GetHashCode
)是
public override int GetHashCode()
{
return (int)this ^ ((int)this << 8);
}
至于为什么,微软有人知道......
答案 1 :(得分:1)
是的,这都是关于价值分配的。由于GetHashCode方法的返回类型是类型为sbyte的int,因此值将以257的间隔分布。对于long类型,同样的原因将是colisions。
答案 2 :(得分:0)
原因是可能是为了避免哈希值的聚类。
正如GetHashCode
documentation所说:
为获得最佳性能,哈希函数必须生成随机数 所有输入的分配。 在类上提供良好的散列函数会显着影响 将这些对象添加到哈希表的性能。在哈希表中 一个好的哈希函数实现,搜索一个元素 恒定时间(例如,O(1)操作)。
另外,正如this excellent article所解释的那样:
指南:哈希码的分布必须是“随机的” 通过“随机分布”,我的意思是如果被散列的对象中存在共性,则在生成的散列码中不应存在类似的共性。例如,假设您正在散列一个表示点的纬度和经度的对象。一组这样的位置很可能被“聚集”;例如,你的位置大多数位于同一个城市的房屋,或者大多数是同一油田的阀门,或者其他什么,这样的可能性很大。如果群集数据产生群集哈希值,则可能会减少使用的桶数,并在桶变得非常大时导致性能问题。