ETag は Last-Modified ヘッダーに似ています。クライアントによる変更を決定するメカニズムです。
ETag は、リソースの状態と特定の形式を表す一意の値である必要があります (リソースには、それぞれ独自の ETag を必要とする複数の形式が含まれる場合があります)。リソースのドメイン全体で一意ではなく、単にリソース内で一意です。
現在、技術的には、ETag は Last-Modified ヘッダーと比較して「無限」の解像度を持っています。Last-Modified は 1 秒単位でのみ変更されますが、ETag は 1 秒未満になる可能性があります。
ETag と Last-Modified の両方を実装することも、どちらか一方だけを実装することもできます (もちろん、何も実装しないこともできます)。Last-Modified だけでは不十分な場合は、ETag を検討してください。
「すべての」リソースに ETag を設定しないことに注意してください。基本的に、キャッシュされることを期待していないもの (特に動的コンテンツ) には設定しません。その場合は意味がありません。無駄な作業です。
編集:あなたの編集を見て、明確にします。
MD5は大丈夫です。唯一の欠点は、常に MD5 を計算することです。たとえば、200K の PDF ファイルで MD5 を実行すると、コストがかかります。キャッシュされることを期待していないリソースで MD5 を実行するのは、単に無駄です (つまり、動的コンテンツ)。
秘訣は、使用するメカニズムが何であれ、Last-Modified と同じくらい安価であるべきだということです。Last-Modified は、通常、リソースのプロパティであり、通常はアクセスが非常に安価です。
ETag も同様に安価である必要があります。MD5 を使用していて、リソースと MD5 ハッシュの間の関連付けをキャッシュ/保存できる場合、それは優れたソリューションです。ただし、ETag が必要になるたびに MD5 を再計算することは、基本的に ETag を使用してサーバー全体のパフォーマンスを向上させるという考えに反します。