2013-11-20 83 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而發生衝突。

相關問題