理解ValueType 雜湊程式碼實作
在提供的程式碼中,兩個結構體k1 和k2 在Name 欄位中具有不同的字串值,但令人驚訝的是,它們傳回相同的值哈希碼。這是因為值類型的 GetHashCode 實作非常複雜。
CLR 對值類型的處理
對於沒有引用字段或對齊間隙的值類型,CLR 使用透過對結構中的所有位元進行異或運算來實現快速哈希機制。但是,當存在引用欄位或間隙時,CLR 會採用更具選擇性的方法。
選擇性字段哈希
CLR 不會考慮所有字段,而是會迭代結構體的字段並標識第一個可用字段(非空值類型或物件引用)。然後使用該單一欄位和方法表指標計算雜湊碼,該過程結束。
欄位選擇
這解釋了為什麼只有 id 欄位有助於提供的範例中的雜湊程式碼,即使名稱欄位不同。因此,交換 id 和 Name 欄位的順序可確保 Name 欄位用於雜湊。
十進制怪異
值得注意的是,CLR 的快速雜湊存在一個錯誤包含 Decimal 值的結構的計算。 Decimal 的位元無法精確反映其數值,導致在某些情況下產生不正確的雜湊碼。
以上是為什麼這些值類型儘管字串欄位不同但具有相同的雜湊碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!