我可以使用对象的哈希码作为缓存密钥吗?
我的假设是每个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;
}
}
答案 0 :(得分:3)
我可以使用对象的哈希码作为缓存密钥吗?
没有。不是没有额外的故障保护。
我的假设是每个条件的哈希值相同, 属性值是一样的吗?
假设是错误的。哈希代码必须仅对于实现IEquatable<T>
并且相等的对象是相同的,但即使在这种情况下,对于不相等的对象,它们不需要也不同。由于在一般情况下,可能的不同Criteria
实例的数量是无限的,而哈希码的范围是有限的,因此pigeonhole principle将始终存在冲突。
答案 1 :(得分:2)
是的,GetHashCode
实现的权利返回相同对象状态的相同int
值(例如,相同的属性值)。但是,您不能假设具有不同状态/值的每个对象都具有不同的哈希代码。即使正确实现GetHashCode
,也可以为不同的对象提供相同的哈希码。