背景
クライアントとサーバー間でデータが転送される際、エラーが発生する可能性があります。 現在、OSS はどのモードでも、アップロードされたオブジェクトの 64 ビット CRC 値を返すことができます。 データ整合性をチェックするため、クライアントは 64 ビット CRC 値をローカルで計算された値と比較します。
- OSS は、新しくアップロードされたオブジェクトの 64 ビット CRC 値を計算し、その結果をオブジェクトのメタデータとして格納します。その後、返された応答ヘッダーに、64 ビット CRC 値を示す x-oss-hash-crc64ecma ヘッダーを追加します。 この 64 ビット CRC は、ECMA-182 規格に従って計算されています。
- 64 ビット CRC が計算される以前に OSS にすでに存在するオブジェクトについては、OSS はその 64 ビット CRC 値を計算しません。 したがって、そのようなオブジェクトが取得されても、その 64 ビット CRC 値は返されません。
操作説明書
-
"Put Object" / "Append Object" / "Post Object" / パーツのマルチパートアップロードは、対応する 64 ビット CRC 値を返します。 クライアントは、アップロードが完了した後、サーバーから返される 64 ビット CRC 値を取得し、それをローカルの算出値と照合します。
-
マルチパートの場合 すべてのパーツに 64 ビット CRC 値がある場合、オブジェクト全体の 64 ビット CRC 値が返されます。 それ以外の場合は、64 ビット CRC 値は返されません (たとえば、64 ビット CRC の計算がなされる以前にパーツがアップロードされている場合)。
-
"Get Object" / "Head Object" / "Get ObjectMeta" は、対応する 64 ビット CRC 値を返します (存在している場合)。 オブジェクトの取得が完了すると、クライアントはサーバーから返された 64 ビット CRC 値を取得し、それをローカルに計算された値と比較します。
注 オブジェクト全体の 64 ビット CRC 値が、範囲オブジェクトに対して返されます。 - コピー関連操作、例えば、 "Copy Object" / "Upload Part Copy" では、新しく生成されたオブジェクトパーツは必ずしも 64 ビット CRC 値を有するわけではありません。
Python の例
完全な Python コードの例は次のとおりです。 64 ビット CRC 値に基づき、データ転送の整合性を検査する方法を示します。
- 64 ビット CRC 値の計算
import oss2 from oss2.models import PartInfo import os import crcmod import random import string do_crc64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693L, initCrc=0L, xorOut=0xffffffffffffffffL, rev=True) def check_crc64(local_crc64, oss_crc64, msg="check crc64"): if local_crc64 ! = oss_crc64: print "{0} check crc64 failed. local:{1}, oss:{2}.".format(msg, local_crc64, oss_crc64) return False else: print "{0} check crc64 ok.".format(msg) return True def random_string(length): return ''.join(random.choice(string.lowercase) for i in range(length)) bucket = oss2. Bucket(oss2. Auth(access_key_id, access_key_secret), endpoint, bucket_name)
- "Put Object" の検証
content = random_string(1024) key = 'normal-key' result = bucket.put_object(key, content) oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '') local_crc64 = str(do_crc64(content)) check_crc64(local_crc64, oss_crc64, "put object")
- "Get Object" の検証
result = bucket.get_object(key) oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '') local_crc64 = str(do_crc64(result.resp.read())) check_crc64(local_crc64, oss_crc64, "get object")
- "Upload Part" の検証と完了
part_info_list = [] key = "multipart-key" result = bucket.init_multipart_upload(key) upload_id = result.upload_id part_1 = random_string(1024 * 1024) result = bucket.upload_part(key, upload_id, 1, part_1) oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '') local_crc64 = str(do_crc64(part_1)) #Check whether the uploaded part 1 data is complete check_crc64(local_crc64, oss_crc64, "upload_part object 1") part_info_list.append(PartInfo(1, result.etag, len(part_1))) part_2 = random_string(1024 * 1024) result = bucket.upload_part(key, upload_id, 2, part_2) oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '') local_crc64 = str(do_crc64(part_2)) #Check whether the uploaded part 2 data is complete check_crc64(local_crc64, oss_crc64, "upload_part object 2") part_info_list.append(PartInfo(2, result.etag, len(part_2))) result = bucket.complete_multipart_upload(key, upload_id, part_info_list) oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '') local_crc64 = str(do_crc64(part_2, do_crc64(part_1))) #Check whether the final object on the OSS is consistent with the local file check_crc64(local_crc64, oss_crc64, "complete object")
OSS SDK のサポート
次の表に示すように、OSS SDK の一部では、アップロードとダウンロードに crc64 を使用したデータ検証がすでにサポートされています。
CRC に対する SDK のサポート例 | ||
---|---|---|
Java SDK | はい | CRCSample.java |
Python SDK | はい | object_check.py |
PHP SDK | いいえ | N/A |
C# SDK | いいえ | None |
C SDK | はい | oss_crc_sample.c |
JavaScript SDK | いいえ | None |
Go SDK | はい | crc_test.go |
Ruby SDK | いいえ | None |
iOS SDK | はい | OSSCrc64Tests.m |
Android SDK | はい | OSSCrc64Tests.m |