2015-09-29 13 views
5

Böyle bir JSON nesnesi döndürebilir (Nancy inşa ASP.NET üzerinde çalışan) REST API vardır.ETag'lar üretmek için etkili ve işleme ucuz bir algoritma nedir? bunun yerine bir temsildir var, bu nesne doğrudan varlık değildir nasıl</p> <pre><code>{ id: "1", name: "Fred", reviews: [ { id: "10", content: "I love Stack Overflow" } ] } </code></pre> <p>Not:

Genellikle, DB'de ETag olarak varlığın son değiştirilmiş/zaman damgasını kullanırdım, sonra güncelleştirildiğinde, ETag güncellenir. Basit.

Ancak bu durumda, kullanıcı değişmezse, ancak ilk incelemenin içeriği değişirse ne olur? Yukarıda belirtilen ETag mantığını kullanarak değişmezdi. Temsiliyetin birden fazla varlık içerdiği bir durum var ve bunu benzersiz bir şekilde tanımlamak için bir yol bulmaya çalışıyorum. Bu nedenle, bir şekilde bu gösterimi (bir Redis önbelleğinde saklanan basit bir C# POCO olan) tanımlamam gerekir.

  • Object.GetHashCode(): Burada

    benim ilk düşüncelerim. Çalışmayacak çünkü hafıza referansı her zaman farklı olacaktır.
  • Nesneye bellek akışı, SHA1 hash. Her zaman yapmak pahalıya mal olur.
  • Önbelleği eklemeden/güncellemeden önce ETag için kullanılacak bir GUID oluşturun ve bunu önbellekte saklayın. Daha sonra önbellek alındığında (önceki örnekte olduğu gibi), yeni bir GUID oluşturulur ve ETag güncellenir. Bu yaklaşımdaki sorun, ETag mekanizmamı önbellekleme uygulamasına bağladım (bu nedenle gevşek bir şekilde bağlı değil).

Bunu yapmayı herkes için ucuz/etkili bir yol düşünebilir mi, ideal olarak global düzeyde? (ör., her bir varlık/kaynak için spesifik ETag üretim mantığı yerine Object veya temel nesne).

Çok teşekkürler!

cevap

1

Karma yaklaşımın çok da kötü olmadığını düşünüyorum. MurmurHash3 (128 bit sürümü) ve xxHash (64 bit sürümü) gibi düşünebileceğim son derece verimli karma algoritmalar var. Bu, gobally yapmak için etkili bir yoldur, ancak maalesef bu ucuz değildir. C# uygulamaları here ve here'u bulabilirsiniz.

Veritabanındaki her varlığın değiştirilmiş bir zaman damgası olduğunu söylediniz. Model birkaç varlıktan oluşuyorsa, model ETag, varlıklar zaman damgalarından türetilebilir. Model ETag, varlıkların zaman damgasının birleşimidir. Bu yaklaşım daha verimlidir fakat bunu yapamazsınız, her model için özel kod yazmanız gerekir.

İlgili konular