2009-04-16 3 views
6

Abbiamo un set di dati sui prezzi che modifica i valori contenuti o il numero di record. Il numero di record aggiunti o rimossi è piccolo rispetto alle modifiche nei valori. Il set di dati di solito ha tra 50 e 500 elementi con 8 proprietà.La migliore funzione hash per il rilevamento delle modifiche dei dati?

Attualmente utilizziamo AJAX per restituire una struttura JSON che rappresenta il set di dati e aggiornare una pagina Web utilizzando questa struttura con i nuovi valori e dove necessario rimuovere o aggiungere elementi.

Effettuiamo la richiesta con due valori hash, uno per i valori e un altro per i record. Questi sono hash MD5 restituiti con la struttura JSON da inviare con una richiesta successiva. Se c'è una modifica agli hash sappiamo che abbiamo bisogno di una nuova struttura JSON altrimenti gli hash sono appena tornati per risparmiare larghezza di banda ed eliminare l'elaborazione lato client non necessaria.

Come MD5 viene normalmente utilizzato con la crittografia è la migliore scelta di algoritmo di hashing per il rilevamento delle modifiche dei dati?

Quali metodi alternativi possiamo rilevare una modifica ai valori e aggiornare così come rilevare elementi aggiunti o rimossi e manipolare il DOM della pagina di conseguenza?

risposta

10

MD5 è un algoritmo ragionevole per rilevare le modifiche a un set di dati. Tuttavia, se non sei interessato alle proprietà crittografiche e sei molto interessato alle prestazioni dell'algoritmo, potresti utilizzare un algoritmo più semplice in stile checksum che non è progettato per essere crittograficamente sicuro. (sebbene negli ultimi anni siano stati scoperti punti deboli in MD5, è ancora progettato per essere crittograficamente sicuro, e quindi fa più lavoro di quanto potrebbe essere richiesto per il tuo scenario).

Tuttavia, se si è soddisfatti delle prestazioni computazionali di MD5, mi limiterei a seguirlo.

-3

Penso che qualsiasi funzione di hash comunemente utilizzata farà ciò che si desidera: fornire una rappresentazione univoca di un'entità.

Per il problema che si sta tentando di risolvere, la mia soluzione sarebbe quella di avere una tabella di back-end che registra tutte le modifiche. Non le stesse modifiche, ma un identificatore delle righe che sono cambiate. Su base periodica, richiamare il server e ottenere un elenco di tutti gli oggetti che sono stati modificati, e usarlo per decidere sul client quali righe devono essere aggiornate/eliminate/aggiunte.

+1

Si tratta di un malinteso comune. Le funzioni di hash non "forniscono una rappresentazione univoca di un'entità". In effetti, è garantito che non sia il caso per qualsiasi funzione di hash il cui dominio è più grande del suo intervallo. – recursive

0

Quello che stai facendo sembra abbastanza buono per me.

Se la capacità lato server è economica e l'utilizzo della rete è minimo, è possibile che il server ricordi, per ogni client, qual è il suo ultimo dataset e invia solo le differenze (come un elenco di inserimenti, eliminazioni e modifiche) su ogni richiesta. Se si ordinano prima le righe dei dati, queste differenze possono essere calcolate in modo abbastanza efficiente utilizzando un algoritmo di differenziazione come quello utilizzato da diff.

Questo approccio è sensibile alle interruzioni di rete: se una risposta non viene ricevuta dal client, gli errori si accumulano. Tuttavia, questo può essere risolto facendo in modo che il client abbia inviato l'hash MD5 ad ogni richiesta: se è diverso da quello che il server si aspetta, verrà inviato un intero elenco invece di un elenco di modifiche.

4

MD5 va bene. In caso di prestazioni troppo basse, è possibile provare l'algoritmo di checksum veloce, ad esempio Adler-32.

0

Sono d'accordo con la risposta di Jonathan riguardo MD5. Per quanto riguarda i modi alternativi per rilevare le modifiche, se si è disposti a memorizzare (o già memorizzare) sul server l'ora/la data della modifica più recente, è possibile passare avanti e indietro al client.Si evita completamente il calcolo e si potrebbe persino essere in grado di utilizzare la maggior parte del codice esistente.

-
BMB