2015-09-29 10 views
5

mam API REST (zbudowany w Nancy, który działa w ASP.NET), który może zwrócić obiekt JSON tak:Co jest efektywnym i niedrogim algorytmem do generowania tagów ETag?

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

zauważyć, jak ten obiekt nie jest bezpośrednim podmiotem, a nie jest to reprezentacja.

Zwykle użyłbym ostatniej modyfikacji/znacznika czasowego obiektu w DB jako ETag, a następnie, gdy zostanie zaktualizowany, ETag zostaje zaktualizowany. Prosty.

Ale w takim przypadku, co jeśli użytkownik się nie zmieni, ale zmieni się treść pierwszej recenzji? Wykorzystanie wspomnianej logiki ETag nie zmieniłoby się. Mamy tutaj przypadek, w którym reprezentacja obejmuje wiele podmiotów i próbuję znaleźć sposób, aby to jednoznacznie zidentyfikować.

Muszę więc jakoś zidentyfikować tę reprezentację (która jest prostym plikiem C# POCO przechowywanym w pamięci podręcznej Redis).

Oto moje pierwsze myśli:

  • Object.GetHashCode(). Nie zadziała, ponieważ odwołanie do pamięci zawsze będzie inne.
  • Strumień pamięci obiektu, SHA1 hash to. Kosztowne za każdym razem.
  • Zanim dodaję/zaktualizuję pamięć podręczną, utwórz identyfikator GUID, który będzie używany dla ETag i zapamiętaj go również w pamięci podręcznej. Następnie, gdy bufor podręczny zostanie przepłukany (co byłoby, w poprzednim przykładzie), generowany jest nowy identyfikator GUID, a ETag jest aktualizowany. Problem z tym podejściem polega na tym, że przywiązuję mój mechanizm ETag do mojej implementacji buforowania (więc nie luźno sprzężony).

Czy ktoś może pomyśleć o tanim/skutecznym sposobie na zrobienie tego, najlepiej na poziomie globalnym? (np. Object lub obiekt bazowy zamiast specyficznej logiki generowania ETag dla każdej jednostki/zasobu).

Wielkie dzięki!

Odpowiedz

1

Myślę, że podejście haszowania nie jest takie złe. Istnieją ekstremalnie wydajne algorytmy haszujące, takie jak MurmurHash3 (wersja 128-bitowa) i xxHash (wersja 64-bitowa), które bym rozważył. Jest to skuteczny sposób, aby zrobić to gobally, ale niestety nie jest to najtańsze. Możesz znaleźć C# implementacje here i here.

Powiedziałeś, że każda jednostka w bazie danych ma zmodyfikowany znacznik czasu. Jeśli model składa się z kilku elementów, model ETag może pochodzić od znaczników czasu encji. Model ETag byłby połączeniem znaczników czasu encji. Takie podejście jest bardziej wydajne, ale nie można tego zrobić gobally, trzeba napisać konkretny kod dla każdego modelu.

Powiązane problemy