Giải pháp thông thường là để giữ một hash của file đám mây nơi nào đó, thường là trong siêu dữ liệu của tập tin và so sánh nó với các hash của tệp cục bộ của bạn. Checksums là không phù hợp cho hoạt động này bởi vì họ có một cơ hội rất cao của va chạm (tức là các tập tin khác nhau có cùng checksum).
Hầu hết các dịch vụ lưu trữ (bộ nhớ Azure Blob, Amazon S3, CloudFiles) thực sự sử dụng mã MD5 hoặc SHA của một tệp làm ETag, giá trị được sử dụng để phát hiện các thay đổi đối với tệp cho mục đích lưu vào bộ nhớ cache và đồng thời. Thông thường, thao tác HEAD trên tệp sẽ trả về các tiêu đề và giá trị ETag của nó.
Nếu bạn có tùy chọn chọn thuật toán của riêng mình, hãy chọn SHA256 hoặc cao hơn vì các thuật toán này được tối ưu hóa cao và kích thước khối lớn của chúng có nghĩa là tính toán băm cho tệp lớn nhanh hơn nhiều. SHA256 thực sự nhanh hơn nhiều so với thuật toán MD5 cũ.
Bạn đang sử dụng dịch vụ lưu trữ nào?
EDIT
Nếu bạn chỉ muốn kiểm tra các tập tin để tránh tải chúng một lần nữa, bạn có thể sử dụng ETag trực tiếp. ETag được tạo ra cho chính xác mục đích này. Bạn chỉ cần lưu trữ nó cùng với tệp của bạn khi bạn tải xuống nó lần đầu tiên. Đó là cách proxy và cache biết gửi cho bạn một phiên bản được lưu trong bộ nhớ cache của một bức ảnh thay vì nhấn vào máy chủ đích.
Thực tế, bạn có thể chỉ cần thực hiện GET trên tệp với tiêu đề ETag/If-None-Match. Các proxy trung gian và máy chủ web cuối cùng sẽ trả lại mã trạng thái 304 nếu tệp đích không thay đổi.Điều này sẽ giảm một nửa số yêu cầu bạn cần để tải xuống tất cả hình ảnh trong danh sách của bạn.
Một cách khác là để lưu trữ các giá trị tiêu đề Last Modified cho các tập tin và sử dụng If-Modified-Since tiêu đề trong GET
EDIT 2
Bạn đề cập rằng các ETag là null, mặc dù mã của bạn không hiển thị cách bạn truy xuất mã.
HttpResponseMessage có nhiều thuộc tính Tiêu đề, cả hai on the message itself và Content. Bạn cần sử dụng thuộc tính thích hợp để lấy giá trị ETag.
Bạn cũng có thể kiểm tra bằng cách sử dụng Fiddler để đảm bảo máy chủ thực sự trả về một ETag.
EDIT 3
Cuối cùng tìm ra cách để có được một ETag từ Youtube! Câu trả lời đến từ "How to get thumbnail of YouTube video link using YouTube API?"
Thực hiện HEAD hoặc NHẬN trên hình thu nhỏ của YouTube từ ytimg.com
KHÔNG trả lại tiêu đề ETAG hoặc Last-Modified.
Sử dụng API dữ liệu của YouTube và thực hiện GET trên gdata.youtube.com
mặt khác, trả về nhiều thông tin về video. Giá trị ETag được bao gồm, mặc dù tôi nghi ngờ nó thay đổi bất cứ khi nào video thay đổi. Điều này có thể được mặc dù, nếu bạn chỉ muốn tải xuống một hình ảnh khi video thay đổi hoặc bạn không muốn tải lại hình ảnh lần nữa.
Code tôi sử dụng là:
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();
...
}
Bạn đang sử dụng dịch vụ lưu trữ nào? Hầu hết các dịch vụ sử dụng băm cho mục đích tương tranh nhưng cách bạn truy xuất băm có thể khác nhau –
các tệp được đề cập là hình thu nhỏ video trên youtube –
Sao chép [Cách tốt nhất để biết hai tệp là giống nhau không?] (Http://stackoverflow.com/questions/714574/best-way-to-tell-if-hai-files-are-the-same). Ngoài ra, câu hỏi của bạn là một oneliner mà không cho bạn hiểu vấn đề (bạn đã nghiên cứu bất kỳ cách nào so sánh các tập tin và tại sao họ không đủ?) Hoặc bạn đã thử bất cứ điều gì. – CodeCaster