簡體   English   中英

為什么“int”和“sbyte”GetHashCode函數會生成不同的值?

[英]Why do “int” and “sbyte” GetHashCode functions generate different values?

我們有以下代碼:

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)操作)。

此外,正如這篇優秀文章所解釋的:

准則:哈希碼的分布必須是“隨機的”通過“隨機分布”,我的意思是如果被哈希的對象中存在共性,則在所產生的哈希碼中不應存在類似的共性。 例如,假設您正在散列一個表示點的緯度和經度的對象。 一組這樣的位置很可能被“聚集”; 例如,你的位置大多數位於同一個城市的房屋,或者大多數是同一油田的閥門,或者其他什么,這樣的可能性很大。 如果群集數據產生群集哈希值,則可能會減少使用的桶數,並在桶變得非常大時導致性能問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM