背景

クライアントとサーバー間でデータが転送される際、エラーが発生する可能性があります。 現在、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 値に基づき、データ転送の整合性を検査する方法を示します。

  1. 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)
  2. "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")
  3. "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")
  4. "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