La soluzione più comune è quello di mantenere un hash del file nuvola da qualche parte, di solito nei metadati del file e confrontarlo con l'hash del tuo file locale. I checksum non sono adatti a questa operazione perché hanno un'alta probabilità di collisione (ovvero file diversi con lo stesso checksum).
La maggior parte dei servizi di archiviazione (archiviazione BLOB di Azure, Amazon S3, CloudFiles) utilizza effettivamente l'hash MD5 o SHA di un file come ETag, il valore utilizzato per rilevare le modifiche a un file per scopi di caching e simultaneità. In genere, un'operazione HEAD sul file restituirà le intestazioni e il valore ETag.
Se si ha la possibilità di scegliere il proprio algoritmo, scegliere SHA256 o superiore poiché questi algoritmi sono altamente ottimizzati e le loro dimensioni di blocco grandi significano che il calcolo degli hash per i file di grandi dimensioni è molto più veloce. SHA256 è in realtà molto più veloce dell'algoritmo MD5 precedente.
Quale servizio di archiviazione stai utilizzando?
EDIT
Se si desidera solo per controllare i file per evitare di scaricare di nuovo, è possibile utilizzare l'ETag direttamente. ETag è stato creato esattamente per questo scopo. Devi solo memorizzarlo insieme al tuo file quando lo scarichi la prima volta. È così che i proxy e le cache sanno di inviarti una versione cache di una foto invece di colpire il server di destinazione.
In effetti, probabilmente è sufficiente eseguire un GET sul file con le intestazioni ETag/If-None-Match. I proxy intermedi e il server Web finale restituiranno un codice di stato 304 se il file di destinazione non è stato modificato.Questo dimezza il numero di richieste necessarie per scaricare tutte le immagini nel tuo elenco.
Un'alternativa è quella di memorizzare il valore Last-Modified per il file e utilizzare il If-Modified-Since in GET
EDIT 2
Lei ha accennato che l'intestazione ETag è nullo, sebbene il tuo codice non mostri come lo recuperi.
HttpResponseMessage ha più proprietà di intestazioni, sia on the message itself e sia Content. È necessario utilizzare la proprietà corretta per recuperare il valore ETag.
È inoltre possibile controllare utilizzando Fiddler per assicurarsi che il server restituisca effettivamente un ETag.
EDIT 3
finalmente trovato un modo per ottenere un ETag da Youtube! La risposta viene da "How to get thumbnail of YouTube video link using YouTube API?"
Fare un HEAD o GET su una miniatura di YouTube da ytimg.com
NON restituisce le intestazioni ETag o Last-Modified.
L'utilizzo dell'API dati di YouTube e l'esecuzione di un GET su gdata.youtube.com
d'altra parte restituisce una grande quantità di informazioni sul video. È incluso un valore ETag, anche se sospetto che cambi ogni volta che il video cambia. Questo può essere OK, tuttavia, se si desidera scaricare un'immagine solo quando il video cambia, o se non si desidera scaricare nuovamente l'immagine.
Il codice che ho usato era:
var url = "http://gdata.youtube.com/feeds/api/videos/npvJ9FTgZbM?v=2&prettyprint=true&alt=json";
using(var client = new HttpClient())
{
var response = await client.GetAsync(url);
var etag1 = response.Headers.ETag;
var content = await response.Content.ReadAsStringAsync();
...
}
Quale servizio di archiviazione stai utilizzando? La maggior parte dei servizi utilizza gli hash per scopi di concorrenza, ma il modo in cui li recuperi può variare –
i file in questione sono miniature dei video di YouTube –
Duplicato di [Il modo migliore per sapere se due file sono uguali?] (Http://stackoverflow.com/questions/714.574/best-way-to-dire-se-due-files-are-the-same). Inoltre, la tua domanda è una oneliner che non ti mostra di aver compreso il problema (hai cercato dei modi per confrontare i file e perché non erano sufficienti?) O di aver provato qualcosa. – CodeCaster