2015-09-29 13 views
5

Ich habe einen REST-API (in Nancy gebaut, auf ASP.NET ausgeführt wird), die ein JSON-Objekt wie diese zurückgeben können:Was ist ein effektiver und verarbeitungsgünstiger Algorithmus zum Generieren von ETags?

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

Hinweis, wie dieses Objekt nicht um eine direkte Einheit ist, sondern es ist eine Darstellung.

Normalerweise ich einen letzten Änderung/Zeitstempel der Einheit in der DB als ETag verwenden würde, dann, wenn es aktualisiert wird erhalten, wird der ETag aktualisiert. Einfach.

Aber in diesem Fall, was passiert, wenn der Benutzer nicht ändert, aber der Inhalt der ersten Überprüfung ändert? Unter Verwendung der zuvor erwähnten ETag-Logik würde sich dies nicht ändern. Wir haben hier einen Fall, in dem die Repräsentation mehrere Entitäten umfasst, und ich versuche einen Weg zu finden, um dies eindeutig zu identifizieren. So

Ich muß irgendwie diese Darstellung identifizieren (die ein einfacher C# POCO ist, in einem Redis Cache gespeichert).

Hier sind meine ersten Gedanken:

  • Object.GetHashCode(). Funktioniert nicht, weil die Speicherreferenz immer unterschiedlich ist.
  • Speicher das Objekt, SHA1-Hash es streamen. Kostspielig jedes Mal.
  • Bevor ich hinzufügen/den Cache aktualisieren, erstellen Sie eine GUID für den ETag verwendet werden und speichern, dass auch im Cache. Wenn dann der Cache geleert wird (was im vorherigen Beispiel der Fall wäre), wird eine neue GUID erzeugt und der ETag wird aktualisiert. Das Problem bei diesem Ansatz ist, dass ich meinen ETag-Mechanismus mit meiner Caching-Implementierung verbinde (also nicht lose gekoppelt).

jemand eine billige/effektive Art und Weise denken, dies zu tun, im Idealfall auf globaler Ebene? (z. B. Object oder ein Basisobjekt anstelle einer spezifischen ETag-Erzeugungslogik für jede Entität/Ressource).

Vielen Dank!

Antwort

1

ich denke, der Hashing-Ansatz nicht so schlecht ist. Es gibt extrem effiziente Hash-Algorithmen wie MurmurHash3 (128-Bit-Version) und xxHash (64-Bit-Version), die ich in Betracht ziehen würde. Dies ist ein effektiver Weg, es zu tun, aber leider ist es nicht das billigste. Sie finden C# Implementierungen here und here.

Sie haben angegeben, dass jede Entität in der Datenbank einen geänderten Zeitstempel hat. Wenn das Modell aus mehreren Entitäten zusammengesetzt ist, könnte das Modell ETag aus den Zeitstempeln der Entitäten abgeleitet werden. Das Modell ETag wäre die Verkettung der Zeitstempel der Entitäten. Dieser Ansatz ist effizienter, aber Sie können es nicht global machen, Sie müssten für jedes Modell spezifischen Code schreiben.