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

时间:2013-11-20 22:30:29

标签: c#

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

我的假设是每个Criteria的哈希值相同,其中属性值是相同的?

这样的事情:

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

2 个答案:

答案 0 :(得分:3)

  

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

没有。不是没有额外的故障保护。

  

我的假设是每个条件的哈希值相同,   属性值是一样的吗?

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

答案 1 :(得分:2)

是的,GetHashCode实现的权利返回相同对象状态的相同int值(例如,相同的属性值)。但是,您不能假设具有不同状态/值的每个对象都具有不同的哈希代码。即使正确实现GetHashCode,也可以为不同的对象提供相同的哈希码。