Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “为什么?”;int";及;sbyte“;GetHashCode函数生成不同的值?_C#_Hash - Fatal编程技术网

C# “为什么?”;int";及;sbyte“;GetHashCode函数生成不同的值?

C# “为什么?”;int";及;sbyte“;GetHashCode函数生成不同的值?,c#,hash,C#,Hash,我们有以下代码: int i = 1; Console.WriteLine(i.GetHashCode()); // outputs => 1 这是有意义的,除了sbyte和short之外,C#中的所有积分类型都是如此。 即: 为什么会这样?因为该方法(SByte.GetHashCode)的源代码是 public override int GetHashCode() { return(int)this^((int)this是的,这都是关于值的分布。由于GetHashCode方法返回类型

我们有以下代码:

int i = 1;
Console.WriteLine(i.GetHashCode());  // outputs => 1
这是有意义的,除了sbyte和short之外,C#中的所有积分类型都是如此。 即:


为什么会这样?

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

public override int GetHashCode()
{

return(int)this^((int)this是的,这都是关于值的分布。由于GetHashCode方法返回类型对于类型sbyte是int,值将以257的间隔分布。出于同样的原因,长类型将是colion。

原因可能是这样做是为了避免哈希值的聚集

正如
GetHashCode
所说:

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

此外,正如所解释的:

准则:散列码的分布必须是“随机的” “随机分布”指的是,如果散列对象中存在共性,则生成的散列代码中不应存在类似的共性。例如,假设您正在散列一个表示点的纬度和经度的对象。一组这样的位置很可能是“聚集”的;很有可能您的位置集主要位于同一个城市的房屋,或者主要位于同一个油田的阀门,或者其他任何地方。如果群集数据生成群集散列值,则可能会减少使用的存储桶数量,并在存储桶变大时导致性能问题


为什么不?257有什么问题?@ZdeslavVojkovic“为什么它不是1,就像int.GetHashCode一样?”:)因为它是不同的类型。有什么理由它应该是1吗?@ZdeslavVojkovic“但它也是一个整数类型。那么为什么GetHashCode实现不统一呢?”(从另一个角度看,为什么
int.GetHashCode
如此无聊?)@ZdeslavVojkovic是的,我们知道,
GetHashCode
的结果是未指定的。但我不明白为什么
(int)这个((int)这个它会在整个整数范围内(实际上,只有~32k)更多地分布sbyte域中的值……不确定C#,但是Java HashMap(等等),已经使用了重新分配函数。.我认为.net哈希表只是屏蔽掉符号,然后计算余数。因此,我真的看不出这个实现的好处。@code如果pst是正确的,它将导致哈希表中的项分布更加均匀(如果数字范围小,哈希表大小大)这意味着更少的冲突,这意味着更高的效率。@Servy至少对于正数来说,与257相乘对bin分布没有任何影响。257是素数,因此对除257以外的任何表大小都是共素数。唯一有趣的效果是它如何将负数映射为正数。但我不知道这是否是adv反对掩盖符号。我还发现奇怪的是,假设这有帮助,为什么不对无符号字节也这样做?但你能解释一下为什么它能改善分布吗?我不是数学家,所以我不会那么勇敢:)但是,我怀疑它与哈希表和字典类的实现、默认bucket设置等有关。如果您的类中有一个
sbyte
字段,并将其哈希用作类哈希函数的一部分(通常使用
h=h*23+field.GetHashCode()
idiom),我还希望它的性能更好。
sbyte i = 1;
Console.WriteLine(i.GetHashCode());   //  outputs => 257
public override int GetHashCode()
{
    return (int)this ^ ((int)this << 8);
}