2009-09-23 83 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; 
    } 
}