メソッドを使用して文字列のハッシュコードを取得するときに、GetHashCode()
ゼロを返す可能性はありますか、それとも使用されるアルゴリズムはそれ以外のことを保証しますか?
私が尋ねている理由は、ヌル文字列のハッシュを発明する必要があり、定数文字列をハッシュするのではなくゼロを使用することを考えていたユースケースがあるためです。これを行うと、衝突が発生する可能性がどの程度ありますか(衝突が常に発生する可能性があるという明らかな事実を除いて)
明確に答える方法はありません。String.GetHashCode()の動作は、未定義であり、フレームワークバージョン間で変更される可能性があり、32ビットシステムと64ビットシステム間で異なる可能性があると文書化されています。
他の値を選択した場合、衝突が発生する可能性があります。ゼロはかなり妥当なデフォルトです。
Nullable.GetHashCode()は、null値を格納している場合は0を返すため、ゼロのハッシュコードを返すにはいくつかの前例があります。
GetHashCode()
ハッシュコードが一貫している必要があるだけです。一意である必要はありません。したがって、ゼロは有効ですが非常に単純なハッシュ値です:)
明らかに、これはハッシュテーブルで多くの衝突を引き起こします。
文字列ハッシュコードに関しては、いくつかの条件で可能になると思います。
これは危険です。null文字列が空の文字列に強制変換される可能性があります。例えば:
string nullstr = null;
string notnull = nullstr + nullstr;
少し風変わりかもしれませんが、問題が発生したときに問題をデバッグするのに苦労するでしょう。簡単な解決策はstring.Empty.GetHashCode()を使用することです。ハッシュ・コードが一意である必要はありません。