[解決済み] 5GBを超えるファイルのAmazon-S3 Etagを計算するアルゴリズムは何ですか?
質問
Amazon S3にアップロードされた5GB未満のファイルには、ファイルのMD5ハッシュをそのままETagとして付与しているので、ローカルのファイルとS3に置いたファイルが同じかどうかを簡単に確認することができます。
しかし、ファイルが5GBより大きい場合、AmazonはETagを異なる方法で計算します。
たとえば、私は 5,970,150,664 バイトのファイルを 380 個のパーツに分割してアップロードしました。今、S3 はそれが以下の ETag を持っていると示しています。
6bcf86bed8807b8e78f0fc6e0a53079d-380
. 私のローカルファイルには、MD5ハッシュが
702242d3703818ddefe6bf7da2bed757
. ダッシュの後の数字は、マルチパートアップロードのパート数だと思います。
また、新しい ETag (ダッシュの前) はまだ MD5 ハッシュですが、何らかの方法でマルチパートのアップロードから途中でいくつかのメタデータが含まれていると思われます。
Amazon S3 と同じアルゴリズムで ETag を計算する方法を知っている人はいますか?
どのように解決するのですか?
サーバーサイドの暗号化なしで 14MB のファイルをバケットにアップロードし、パートサイズが 5MB だとします。各パートに対応する 3 つの MD5 チェックサム、つまり、最初の 5MB、2 番目の 5MB、最後の 4MB のチェックサムを計算します。そして、それらを連結したチェックサムをとる。MD5 のチェックサムはバイナリデータの 16 進表現で出力されることが多いので、 ASCII や UTF-8 でエンコードされた連結ではなく、デコードされたバイナリ連結の MD5 を取得することを確認してください。それが終わったら、ハイフンとパーツの数を追加してETagを取得します。
以下は、Mac OS Xでコンソールから行うコマンドです。
$ dd bs=1m count=5 skip=0 if=someFile | md5 >>checksums.txt
5+0 records in
5+0 records out
5242880 bytes transferred in 0.019611 secs (267345449 bytes/sec)
$ dd bs=1m count=5 skip=5 if=someFile | md5 >>checksums.txt
5+0 records in
5+0 records out
5242880 bytes transferred in 0.019182 secs (273323380 bytes/sec)
$ dd bs=1m count=5 skip=10 if=someFile | md5 >>checksums.txt
2+1 records in
2+1 records out
2599812 bytes transferred in 0.011112 secs (233964895 bytes/sec)
この時点で、すべてのチェックサムは
checksums.txt
. これらを連結し、16進数をデコードして多くのMD5チェックサムを得るには、単に
$ xxd -r -p checksums.txt | md5
そして、3つのパーツがあったので、ETagを取得するために、"-3"を追加してください。
ノート
-
でアップロードした場合
aws-cli
を経由して
aws s3 cp
を実行すると、チャンクサイズが8MBになる可能性が高いです。によると ドキュメントによると によると、これはデフォルトです。 -
バケツがサーバーサイド暗号化 (SSE) をオンにしている場合、ETag は MD5 チェックサムにはなりません (
API ドキュメント
). しかし、アップロードされたパーツが送信したものと一致するかどうかを確認するためだけなら
Content-MD5
ヘッダと S3はあなたのためにそれを比較します . -
md5
は、macOS ではチェックサムを書き出すだけですがmd5sum
はファイル名も出力します。これを除去する必要がありますが、チェックサムだけを出力するオプションがあるはずです。空白の原因について心配する必要はありません。xxd
はそれを無視するからです。
コードリンク
- 私が書いたGistで macOS 用の作業スクリプト .
- のプロジェクトは s3md5 .
関連
-
[解決済み] Amazon S3はシンボリックリンクをサポートしていますか?
-
[解決済み] ls とワイルドカードを使用して s3 にファイルが存在するかどうかをチェックする
-
[解決済み] S3エラーです。リクエスト時刻と現在時刻の差が大きすぎます。
-
[解決済み] AWS S3: ディスクスペースの使用量を確認する方法
-
[解決済み] AWS S3 2つのバケット間でファイルやフォルダをコピーする
-
[解決済み] S3とAWSコンソールでサブフォルダーを含むフォルダーをアップロードする
-
[解決済み] Amazon S3コンソール: 複数のファイルを一度にダウンロードする
-
[解決済み] S3でのファイル名の最大長は?
-
[解決済み] S3バケット間でファイルを移動する最適な方法とは?
-
[解決済み] 特定の地域からの顧客にサービスを提供するために、どのAWSロケーションが最適かを判断するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Amazon S3はシンボリックリンクをサポートしていますか?
-
[解決済み] ls とワイルドカードを使用して s3 にファイルが存在するかどうかをチェックする
-
[解決済み] S3エラーです。リクエスト時刻と現在時刻の差が大きすぎます。
-
[解決済み] Amazon S3 boto - フォルダを作成する方法は?
-
[解決済み] AWS S3 2つのバケット間でファイルやフォルダをコピーする
-
[解決済み] S3とAWSコンソールでサブフォルダーを含むフォルダーをアップロードする
-
[解決済み] Amazon AWSの課金上限を設定する方法はありますか?[クローズド]
-
[解決済み] S3にある1万個のファイルを公開する方法
-
[解決済み] 特定の地域からの顧客にサービスを提供するために、どのAWSロケーションが最適かを判断するにはどうすればよいですか?
-
[解決済み] S3 バケツに入ったオブジェクトの制限