2015-09-29 49 views
5

我有一個REST API(建於南錫,在ASP.NET運行),可以返回一個JSON對象是這樣的:什麼是生成ETag的有效且處理便宜的算法?

{ 
    id: "1", 
    name: "Fred", 
    reviews: [ 
    { 
     id: "10", 
     content: "I love Stack Overflow" 
    } 
    ] 
} 

注意這個對象是多麼的不直接的實體,而不是它的一個表示。

通常,我會使用DB中實體的最後一次修改/時間戳作爲ETag,然後當它被更新時,ETag會被更新。簡單。

但是在這種情況下,如果用戶沒有改變,但第一個評論的內容改變了怎麼辦?使用前面提到的ETag邏輯,它不會改變。我們在這裏有一個案例,其中表示包含多個實體,我試圖找到唯一標識該方法的方法。

所以我需要以某種方式識別表示(這是一個簡單的C#POCO,存儲在Redis緩存中)。

這裏是我最初的想法:

  • Object.GetHashCode()。將無法正常工作,因爲內存引用將始終不同。
  • 內存流對象,SHA1哈希它。每一次都是昂貴的。
  • 在添加/更新緩存之前,請創建一個用於ETag的GUID並將其存儲在緩存中。然後當刷新緩存(在前面的例子中)時,會生成一個新的GUID並更新ETag。這種方法的問題是我將我的ETag機制綁定到我的緩存實現(所以不是鬆散耦合)。

任何人都可以想到一個便宜/有效的方式來做到這一點,理想情況下在全球範圍內? (例如Object或基礎對象,而不是每個實體/資源的特定ETag生成邏輯)。

非常感謝!

回答

1

我認爲散列法並不是那麼糟糕。有很高效的散列算法,比如MurmurHash3(128位版本)和xxHash(64位版本),我會考慮。這是一個有效的方法,但不幸的是它不是最便宜的。你可以找到c#實現herehere

你說數據庫中的每個實體都有一個修改過的時間戳。如果模型由多個實體組成,則可以從實體時間戳中導出模型ETag。模型ETag將是實體時間戳的串聯。這種方法更高效,但你無法做到這一點,你需要爲每個模型編寫特定的代碼。

相關問題