3

ASP.NETWebサイトで個別のHttpRequestを一意に識別して追跡するための信頼できる方法を見つけようとしています。

HttpRequest.GetHashCode()の実装について誰か知っていますか?具体的には、どのくらいの頻度で衝突が発生しますか?

HashCodesが一意であるとは限らないことを理解しています。私が理解しようとしているのは、統計的に、HashCodeが繰り返されると予想できる頻度です。

私が考えているシステムは、HashCodeの衝突を適切に処理しますが、少なくとも1000分の1程度の一意性があることを確認したいと思います。

4

1 に答える 1

5

ハッシュコードは、その目的ではないため、一意であることが保証されることはありません。ハッシュコードは、2つのインスタンス間の潜在的な同等性の初期の指標として同等性テストを支援するように設計されています。

言い換えると、ハッシュコードは、明らかに等しくない2つのインスタンスをすばやく除外するのに役立ちます。

たぶん、このようなものが最適でしょう:

class TrackableHttpRequest : IEquatable<TrackableHttpRequest>
{
    readonly Guid id = Guid.NewGuid();

    public Guid Id { get { return this.id; } }
    public HttpRequest Request { get; set; }

    public override Int32 GetHashCode()
    {
        return this.Id.GetHashCode();
    }

    public override Boolean Equals(Object obj)
    {
        return this.Equals(obj as TrackableHttpRequest);
    }

    public bool Equals(TrackableHttpRequest other)
    {
        if (other == null)
            return false;

        return this.Id == other.Id;
    }
}
于 2009-09-23T15:11:11.533 に答える