いつ、どのように行実行オブジェクトです。GetHashCode()により複雑な平等か
-
21-08-2019 - |
質問
基本的には、以下のこと:
class Foo {
public override bool Equals(object obj)
{
Foo d = obj as Foo ;
if (d == null)
return false;
return this.Equals(d);
}
#region IEquatable<Foo> Members
public bool Equals(Foo other)
{
if (this.Guid != String.Empty && this.Guid == other.Guid)
return true;
else if (this.Guid != String.Empty || other.Guid != String.Empty)
return false;
if (this.Title == other.Title &&
this.PublishDate == other.PublishDate &&
this.Description == other.Description)
return true;
return false;
}
}
なので、問題はこの:私は非必須です。 Guid
, では、独自の識別子です。こない、そのための決定等に基づく以下の正確な指標として、決定する場合には、二つのオブジェクトが等しいことになります。この作品がで GetHashCode()
汚...いつ、どのように行けているのでしょうか?るナイーブな実装のようなものです:
public override int GetHashCode() {
if (this.Guid != String.Empty)
return this.Guid.GetHashCode();
int hash = 37;
hash = hash * 23 + this.Title.GetHashCode();
hash = hash * 23 + this.PublishDate.GetHashCode();
hash = hash * 23 + this.Description.GetHashCode();
return hash;
}
そのチャンスのハッシュの衝突?確かないこと 1 in 2 ** 32
.がこもっていったということと、その場合、いつ、どのようにしているのですか?
解決
私はあなたが使用することを選択したアプローチに問題があるとは思いません。 「あまりにも多くの」ハッシュの衝突について心配することはほとんど常にオーバー思考、問題の兆候です。限りハッシュは異なる可能性が高いとあなたは問題ないはずです。
時間のほとんどのオブジェクトは、そのタイトルと出版日付に基づいて区別することができることを期待するのは合理的である場合は、最終的にはあなたも、とにかくあなたのハッシュからDescription
を残して検討する必要があります(本?)ます。
あなたも、完全にあなたのハッシュ関数でGUIDを無視考慮し、のみハッシュの衝突の可能性は低い(?)ケースを明確にするためにEquals
の実装でそれを使用することができます。
他のヒント
非常に簡単 ハッシュコードの方法カスタムクラス はビット単位のXORそれぞれの分野の'ハッシュコードです。できとして簡単なこと:
int hash = 0;
hash ^= this.Title.GetHashCode();
hash ^= this.PublishDate.GetHashCode();
hash ^= this.Description.GetHashCode();
return hash;
から 上記リンク:
XORの物件:
- に依存しませんの順に計算である。
- ません"廃棄物"ですね。変更した場合でも一つのビットの部品の最終値が変わります。
- では迅速で、シングルサイクルのプリミティブ。
- で保存します。場合、二つきを測定することが必要であると思うので、組み合わせます。つなが崩壊のダイジェストへのより狭いバンド。
XORがうまくできない場合は重複した値にどの分野で複製値と消がXORed.からだハッシュ、など生活に必要なものは揃って関係のない分野できないという問題です。
所属していません StackOverflow