2013-11-20 33 views
2

我可以使用对象的哈希码作为cachekey吗?我可以使用对象的哈希码作为缓存键吗?

我的假设是散列对每个标准都是一样的,其中属性值是相同的?

像这样:

function void Method1(Criteria criteria) 
{ 
        ObjectCache cache = MemoryCache.Default; 
     string CacheKey = "Method1-" + criteria.GetHashCode(); 

        if(cache.Contains(CacheKey)) 
            return (IEnumerable)cache.Get(CacheKey); 
        else 
        { 
            IEnumerable stuff = repository.GetStuff(); 
  
            CacheItemPolicy cacheItemPolicy = new CacheItemPolicy(); 
            cacheItemPolicy.AbsoluteExpiration = DateTime.Now.AddHours(1.0); 
            cache.Add(CacheKey, stuff, cacheItemPolicy); 
  
            return stuff; 
        } 
} 
+0

你测试了你的假设吗? –

+1

“Criteria”的文档对“GetHashCode”返回的内容有何说法?不要假设。 – shf301

+0

如果你打算这么做,我会推荐'覆盖GetHashCode()'。 – IAbstract

回答

1

是,GetHashCode实现权返回相同的对象状态的相同int值(例如相同的属性值)。但是,您不能假定每个具有不同状态/值的对象都将具有不同的哈希码。即使在GetHashCode正确实施时,也可以为不同的对象使用相同的散列码。

2

我可以使用对象的哈希码作为cachekey吗?

不是。没有没有额外的故障安全。

我的假设是,每个标准的散列值相同, 属性值相同?

该假设是错误的。对于实现IEquatable<T>且相等的对象,哈希代码必须相同,但即使在这种情况下,对于不相等的对象,它们也不是不需要。由于在一般情况下,可能的不同Criteria实例的数量是无限的,而哈希码的范围是有限的,所以总是会由于pigeonhole principle而发生冲突。

相关问题