Immagina un'app client-server che consente all'utente di caricare immagini / documenti ecc. sul server e quindi consente agli utenti che hanno accesso, recuperarli e visualizzarli in un momento successivo rispettivi dispositivi mobili.
Quindi il flusso è qualcosa del genere:
- Creatore (C) crea un messaggio con n numero di allegati.
- C carica i file e il messaggio sul server tramite l'API REST.
- I destinatari R1, R2 ... Rn ricevono notifiche sui nuovi contenuti
- R1, R2 e altri entrano nei loro orari e recuperano il messaggio e gli allegati.
- Una volta scaricato, l'app mobile non richiede il server la prossima volta che qualcuno dei destinatari tenta di visualizzare gli allegati, utilizza dati memorizzati nella cache locale.
Ora il creatore C ha già i file (da quando li ha creati) e non è necessario scaricarli nuovamente. Quindi quando riceve una risposta dal server come:
{
messageId: 123,
attachments : [ { id: a1, ...}, {id: a2, ...}, {id: a3, ...} ]
}
Tuttavia, non sa quale allegato è ciò che (cioè quale è a1
e quale è a2
e così via).
Semplicemente sa che il messaggio # 123 ha 3 allegati.
Quale sarebbe un buon modo per capirlo? Ci sono 2 approcci che mi vengono in mente:
Approccio 1: usa l'hash del file
- Calcola l'hash del file (MD5 o SHA) e utilizzalo come chiave nell'app mobile. Il server
- fa lo stesso e restituisce l'hash come identificatore invece di un id generato.
Pro :
- Non sono necessari metadati aggiuntivi per la sincronizzazione
Contro :
- Probabilmente soggetto a errore - l'hash potrebbe non corrispondere a causa delle differenze di implementazione del sistema operativo o dell'hash
- L'hashing sarà lento per i file di grandi dimensioni
Approccio n. 2: utilizza un tasto
- L'app genera un UUID e lo invia al server come identificatore.
- Il server lo memorizza e restituisce la chiave con la risposta per la sincronizzazione.
Pro
- Gli errori relativi all'hash sono stati eliminati
- La velocità di hash non è un problema dato che la generazione di UUID è abbastanza veloce e deterministica.
Contro
- Viene trasmessa una chiave extra tra l'app / server che non ha altro scopo.
Quale di questi è preferibile? O forse c'è una terza opzione?