2009-09-23 79 views
3

我試圖找到一種可靠的方式來唯一標識和跟蹤ASP.NET網站中的不同HttpRequests。HttpRequest.GetHashCode()實現 - 碰撞發生的頻率?

有沒有人知道任何關於HttpRequest.GetHashCode()的實現?具體來說,碰撞發生的頻率如何?

我知道HashCodes並不保證是唯一的。我試圖理解的是統計我多久可以期待一個HashCode重複自己。

我想到的系統會優雅地處理HashCode碰撞,但我想確保它們至少與1000中的1一樣唯一。

+0

碰撞的可能性是完全依賴於數據,因此沒有人能真正告訴你,除非你有一組固定的輸入頻率會發生衝突這在所有運行中都是不變的。如果您使用我建議的解決方案,您將不會發生碰撞。 – 2009-09-23 15:40:36

+0

嗯,我想這是理論上可能與我的方法相沖突;)http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates – 2009-09-23 15:43:10

回答

5

哈希碼是從不保證是唯一的,因爲這不是他們的目的 - 它們旨在幫助在平等測試中作爲兩個實例之間潛在平等的早期指示符。

換句話說,一個哈希碼可以幫助你快速排除兩個實例,肯定是而不是等於。

也許這樣的事情將是最好的:

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; 
    } 
}