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

时间:2012-09-19 19:59:19

标签: c# hash

我们有以下代码:

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

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

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

为什么会这样?

3 个答案:

答案 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所解释的那样:

  

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