ValueType ハッシュ コードの実装について
提供されたコードでは、2 つの構造体 k1 と k2 の Name フィールドに異なる文字列値がありますが、驚くべきことに同じ値を返します。ハッシュコード。これは、値型に対する GetHashCode の複雑な実装が原因です。
CLR の値型の処理
参照フィールドや位置合わせギャップのない値型の場合、CLR は構造内のすべてのビットを XOR 演算することによる迅速なハッシュ メカニズム。ただし、参照フィールドまたはギャップがある場合、CLR はより選択的なアプローチを使用します。
選択的フィールド ハッシュ
すべてのフィールドを考慮する代わりに、CLR は次のことを繰り返します。構造体のフィールドを調べ、最初に使用可能なフィールド (null 以外の値の型またはオブジェクト参照) を識別します。次に、その 1 つのフィールドとメソッド テーブル ポインターを使用してハッシュ コードが計算され、プロセスは終了します。
フィールドの選択
これは、id フィールドのみが寄与する理由を説明しています。 Name フィールドは異なりますが、提供された例のハッシュ コードは同じです。したがって、id フィールドと Name フィールドの順序を入れ替えることで、Name フィールドがハッシュに利用されるようになります。
10 進数の癖
特に、CLR の高速ハッシュにはバグがあります。 10 進数値を含む構造体の計算。 Decimal のビットはその数値を正確に反映していないため、場合によっては不正なハッシュ コードが生成されます。
以上が文字列フィールドが異なるにもかかわらず、これらの値の型が同じハッシュ コードを持つのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。