ホームページ >バックエンド開発 >C++ >文字列フィールドが異なるにもかかわらず、これらの値の型が同じハッシュ コードを持つのはなぜですか?

文字列フィールドが異なるにもかかわらず、これらの値の型が同じハッシュ コードを持つのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-04 08:47:39139ブラウズ

Why Do These Value Types Have the Same Hash Code Despite Different String Fields?

ValueType ハッシュ コードの実装について

提供されたコードでは、2 つの構造体 k1 と k2 の Name フィールドに異なる文字列値がありますが、驚くべきことに同じ値を返します。ハッシュコード。これは、値型に対する GetHashCode の複雑な実装が原因です。

CLR の値型の処理

参照フィールドや位置合わせギャップのない値型の場合、CLR は構造内のすべてのビットを XOR 演算することによる迅速なハッシュ メカニズム。ただし、参照フィールドまたはギャップがある場合、CLR はより選択的なアプローチを使用します。

選択的フィールド ハッシュ

すべてのフィールドを考慮する代わりに、CLR は次のことを繰り返します。構造体のフィールドを調べ、最初に使用可能なフィールド (null 以外の値の型またはオブジェクト参照) を識別します。次に、その 1 つのフィールドとメソッド テーブル ポインターを使用してハッシュ コードが計算され、プロセスは終了します。

フィールドの選択

これは、id フィールドのみが寄与する理由を説明しています。 Name フィールドは異なりますが、提供された例のハッシュ コードは同じです。したがって、id フィールドと Name フィールドの順序を入れ替えることで、Name フィールドがハッシュに利用されるようになります。

10 進数の癖

特に、CLR の高速ハッシュにはバグがあります。 10 進数値を含む構造体の計算。 Decimal のビットはその数値を正確に反映していないため、場合によっては不正なハッシュ コードが生成されます。

以上が文字列フィールドが異なるにもかかわらず、これらの値の型が同じハッシュ コードを持つのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。