すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:CRC-64を使用してデータの整合性を確認する

最終更新日:Dec 20, 2023

クライアントとサーバー間でデータが転送されるときにエラーが発生することがあります。 Object Storage Service (OSS) は、提供されているいずれかのメソッドでアップロードされたオブジェクトのCRC-64値を返します。 クライアントは、CRC-64値をローカルマシンで計算されたCRC-64値と比較して、データの整合性を検証します。

背景情報

OSSは、ECMA-182標準に基づいてアップロードされたオブジェクトのCRC-64値を計算し、CRC-64値をオブジェクトのメタデータ項目として含め、CRC-64値をx-oss-hash-crc64ecmaヘッダーとしてレスポンスに返します。

CRC-64のチェックサムがサポートされる前にオブジェクトがすでにOSSにアップロードされている場合、OSSはオブジェクトのCRC-64値を計算しません。 オブジェクトを要求すると、応答にCRC-64値は含まれません。

使用上の注意

  • PutObject、AppendObject、PostObject、およびMultipartUploadPart操作は、対応するCRC-64値を返します。 クライアントは、アップロードが完了した後にサーバーによって返されたCRC-64値を取得し、ローカルマシンで計算された値と照合することができます。

  • MultipartComplete操作が呼び出されると、各部分にCRC-64値がある場合、オブジェクト全体のCRC-64値が返されます。 いずれかの部品にCRC-64値がない場合、OSSは最終オブジェクトのCRC-64値を返しません。 たとえば、CRC-64のチェックサムがサポートされる前に部品がアップロードされた場合、その部品および最終オブジェクトのCRC-64値は返されません。

  • GetObject、HeadObject、およびGetObjectMeta操作は、対応するCRC-64値 (存在する場合) を返します。 GetObject操作が完了すると、クライアントはサーバーから返されたCRC-64値を取得し、ローカルマシンで計算された値と照合します。

    説明

    Rangeヘッダーを含むGETリクエストは、オブジェクト全体のCRC-64値を返します。

  • CopyObjectやUploadPartCopyなどのコピー操作から生成された宛先オブジェクトには、CRC-64値がない場合があります。

Pythonの次のサンプルコードは、CRC-64値を使用してデータの整合性を検証する方法の例を示しています。

oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
crcmodのインポート
ランダムにインポート
インポート文字列
oss2.modelsからPartInfoをインポート

# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# バケットの名前を指定します。 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'yourBucketName')
# CRC-64検証関数を作成します。 
do_crc64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693、initCrc=0、xorOut=0xffffffffffff、rev=True)

# CRC-64値を確認し、結果を表示します。 
def check_crc64(local_crc64, oss_crc64, msg="check crc64"):
    if local_crc64! =oss_crc64:
        print("{0} チェックcrc64に失敗しました。 local:{1}, oss:{2}.".format(msg, local_crc64, oss_crc64))
        Falseを返す
    else:
        print("{0} check crc64 ok.".format(msg))
        真を返す

# 指定した長さのランダムな文字列を生成します。 
def random_string(length):
    return ''.join (range(length) 内のiに対するrandom.choice(string.ascii_lowercase))

# 長さ1024のランダムな文字列を生成します。 
content = random_string(1024)

# オブジェクトのパスを指定します。 
key = 'normal-key'

# GetObject操作のデータ整合性を確認します。 
result = bucket.put_object (キー、コンテンツ)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma ', '')
local_crc64 = str(do_crc64(oss2.to_bytes(content)))
check_crc64(local_crc64, oss_crc64, "put object")

# GetObject操作のデータ整合性を確認します。 
result = bucket.get_object (キー)
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")

# 部品と最終オブジェクトのデータ整合性を確認します。 
part_info_list = []
key = "multipart-key"
result = bucket.init_multipart_upload (キー)
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(oss2.to_bytes(part_1)))
# パート1の整合性を確認します。 
check_crc64(local_crc64、oss_crc64、"upload_partオブジェクト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(oss2.to_bytes(part_2)))
# パート2の整合性を確認します。 
check_crc64(local_crc64、oss_crc64、"upload_partオブジェクト2")
part_info_list.append(PartInfo(2, result.etag, len(part_2)))
result = bucket.com plete_multipart_upload(key, upload_id, part_info_list)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma ', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_2), do_crc64(oss2.to_bytes(part_1))))
# OSSにアップロードされた最終オブジェクトがローカルファイルと同じかどうかを確認します。 
check_crc64(local_crc64, oss_crc64, "complete object") 

サポートされているOSS SDK

次の表に、ダウンロードとアップロードのCRC-64をサポートするOSS SDKを示します。

SDK

CRCサポート

OSS SDK for Java

必須

CRCSample.java

Python用OSS SDK

必須

object_check.py

OSS SDK for PHP

なし

OSS SDK for C#

なし

OSS SDK for C

必須

oss_crc_sample.c

JavaScript用OSS SDK

なし

OSS SDK for Go

必須

crc_test.go

Ruby用OSS SDK

なし

iOS用OSS SDK

必須

OSSCrc64Tests.m

Android用OSS SDK

必須

CRC64Test.java