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

Object Storage Service:CRC-64 を使用したデータ整合性のチェック

最終更新日:Nov 09, 2025

クライアントとサーバー間のデータ転送中にエラーが発生する可能性があります。Object Storage Service (OSS) は、アップロードされたオブジェクトに対して 64 ビット巡回冗長検査 (CRC-64) 値を返します。返された値をローカルで計算された CRC-64 値と比較して、データ整合性を検証できます。

背景情報

OSS は、新しくアップロードされたオブジェクトの CRC-64 値を計算し、その結果をオブジェクトのメタデータとして保存します。応答ヘッダーには、CRC-64 値を指定する x-oss-hash-crc64ecma ヘッダーが含まれています。この 64 ビット CRC は、CRC-64/XZ アルゴリズムに基づいて計算されます。

OSS は、この機能が利用可能になる前にアップロードされたオブジェクトの CRC-64 値を計算しません。そのため、これらのオブジェクトを取得しても CRC-64 値は返されません。

使用上の注意

  • PutObject、AppendObject、PostObject、および MultipartUploadPart 操作は CRC-64 値を返します。アップロードが完了した後、サーバーから CRC-64 値を取得し、ローカルで計算した値と比較できます。

  • CompleteMultipartUpload 操作を呼び出すとき、オブジェクト全体の CRC-64 値が返されるのは、そのすべてのパートに CRC-64 値がある場合のみです。いずれかのパートに 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 値を使用してデータ整合性を検証する方法の例を示しています。

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import crcmod
import random
import string
from oss2.models import PartInfo

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

# CRC-64 をチェックして結果を出力します。
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.ascii_lowercase) for i in range(length))

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

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

# PutObject を検証します。
result = bucket.put_object(key, content)
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(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")

# UploadPart と Complete を検証します。
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(oss2.to_bytes(part_1)))
# アップロードされたパート 1 のデータ整合性をチェックします。
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(oss2.to_bytes(part_2)))
# アップロードされたパート 2 のデータ整合性をチェックします。
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(oss2.to_bytes(part_2), do_crc64(oss2.to_bytes(part_1))))
# OSS 上の最終的なオブジェクトがローカルファイルと一致するかどうかをチェックします。
check_crc64(local_crc64, oss_crc64, "complete object")

OSS SDK のサポート

一部の OSS SDK は、アップロードとダウンロードのための CRC-64 データ整合性チェックをサポートしています。例については、次の表をご参照ください。

SDK

CRC サポート

Java SDK

はい

CRCSample.java

Python SDK

はい

object_check.py

PHP SDK

いいえ

なし

C# SDK

いいえ

なし

C SDK

はい

oss_crc_sample.c

JavaScript SDK

いいえ

なし

Go SDK

はい

crc_test.go

Ruby SDK

いいえ

なし

iOS SDK

はい

OSSCrc64Tests.m

Android SDK

はい

CRC64Test.java