2009-04-16 7 views
6

Wir haben einen Preisdatensatz, der die enthaltenen Werte oder die Anzahl der Datensätze ändert. Die Anzahl der hinzugefügten oder entfernten Datensätze ist im Vergleich zu den Änderungen der Werte gering. Der Datensatz enthält normalerweise zwischen 50 und 500 Elemente mit 8 Eigenschaften.Best Hash-Funktion zum Erkennen von Datenänderungen?

Wir verwenden derzeit AJAX, um eine JSON-Struktur zurückzugeben, die das Dataset darstellt, und aktualisieren eine Webseite, die diese Struktur verwendet, mit den neuen Werten und entfernt oder fügt bei Bedarf Elemente hinzu.

Wir machen die Anfrage mit zwei Hash-Werten, einen für die Werte und einen anderen für die Datensätze. Dies sind MD5-Hashes, die mit der JSON-Struktur zurückgegeben wurden, um mit einer folgenden Anforderung gesendet zu werden. Wenn es eine Änderung an den Hashes gibt, wissen wir, dass wir eine neue JSON-Struktur benötigen, andernfalls werden die Hashes nur zurückgegeben, um Bandbreite zu sparen und unnötige clientseitige Verarbeitung zu vermeiden.

Wie MD5 normalerweise mit Verschlüsselung verwendet wird, ist die beste Wahl des Hashalgorithmus für nur Datenänderungen zu erkennen?

Welche alternativen Möglichkeiten können eine Änderung der Werte und die Aktualisierung sowie das Erkennen von hinzugefügten oder entfernten Elementen und die entsprechende Manipulation des Seiten-DOMs erkennen?

Antwort

10

MD5 ist ein sinnvoller Algorithmus zum Erkennen von Änderungen an einem Datensatz. Wenn Sie sich jedoch nicht mit den kryptografischen Eigenschaften befassen und sehr an der Leistung des Algorithmus interessiert sind, könnten Sie mit einem einfacheren Prüfsummen-Algorithmus arbeiten, der nicht kryptografisch sicher ist. (Obwohl Schwachstellen in MD5 in den letzten Jahren entdeckt wurden, ist es immer noch kryptografisch sicher und macht daher mehr Arbeit, als für Ihr Szenario erforderlich ist).

Wenn Sie jedoch mit der Rechenleistung von MD5 zufrieden sind, würde ich einfach dabei bleiben.

-3

Ich denke, dass jede häufig verwendete Hash-Funktion tun wird, was Sie wollen - eine einzigartige Darstellung einer Entität bereitstellen.

Für das Problem, das Sie versuchen zu lösen, wäre meine Lösung, eine Backend-Tabelle zu haben, die alle Änderungen aufzeichnet. Nicht die Änderungen selbst, sondern eine Kennung der Zeilen, die sich geändert haben. Rufen Sie in regelmäßigen Abständen einen Rückruf zum Server ab und rufen Sie eine Liste aller Objekte ab, die sich geändert haben, und verwenden Sie dies, um auf dem Client zu entscheiden, welche Zeilen aktualisiert/gelöscht/hinzugefügt werden müssen.

+1

Dies ist ein weit verbreitetes Missverständnis. Hash-Funktionen stellen keine eindeutige Repräsentation einer Entität dar. In der Tat ist es garantiert nicht der Fall für irgendeine Hash-Funktion, deren Domäne größer als ihr Bereich ist. – recursive

0

Was Sie tun, klingt ziemlich gut zu mir.

Wenn die serverseitige Kapazität günstig ist und die Netzwerkauslastung entscheidend ist, können Sie sich den Server für jeden Client merken, was der letzte Datensatz war, und nur die Unterschiede senden (als Liste von Einfügungen, Löschungen und Bearbeitungen)) bei jeder Anfrage. Wenn Sie Ihre Datenzeilen zuerst sortieren, können diese Unterschiede mit einem Differenzierungsalgorithmus, wie er von diff verwendet wird, ziemlich effizient berechnet werden.

Dieser Ansatz ist anfällig für Netzwerkausfälle - wenn eine Antwort vom Client nicht empfangen wird, werden Fehler akkumuliert. Dies kann jedoch dadurch behoben werden, dass der Client bei jeder Anfrage den MD5-Hash gesendet hat: Wenn er sich von dem unterscheidet, was der Server erwartet, wird eine vollständige Liste anstelle einer Liste von Änderungen gesendet.

4

MD5 ist in Ordnung. Sollte die Leistung zu niedrig sein, können Sie einen schnellen Prüfsummenalgorithmus ausprobieren, wie zum Beispiel Adler-32.

0

Ich stimme Jonathan's Antwort in Bezug auf MD5. Wenn Sie alternative Möglichkeiten zur Erkennung von Änderungen finden, können Sie das Datum und die Uhrzeit der letzten Änderung auf dem Server speichern (oder bereits speichern) und dann an den Client weitergeben.Sie vermeiden die Berechnung vollständig und können möglicherweise sogar den meisten vorhandenen Code verwenden.

-
bmb

Verwandte Themen