From 06cc8980f4a63c8e9333418f8e73fe520b4400e7 Mon Sep 17 00:00:00 2001 From: JinmingHu Date: Thu, 3 Jun 2021 09:36:14 +0800 Subject: [PATCH] Add sample for transactional checksum (#2384) --- .../azure-storage-blobs/CMakeLists.txt | 1 + .../sample/transactional_checksum.cpp | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 sdk/storage/azure-storage-blobs/sample/transactional_checksum.cpp diff --git a/sdk/storage/azure-storage-blobs/CMakeLists.txt b/sdk/storage/azure-storage-blobs/CMakeLists.txt index 6e3440736..8ac8b676e 100644 --- a/sdk/storage/azure-storage-blobs/CMakeLists.txt +++ b/sdk/storage/azure-storage-blobs/CMakeLists.txt @@ -115,6 +115,7 @@ if(BUILD_STORAGE_SAMPLES) sample/blob_getting_started.cpp sample/blob_list_operation.cpp sample/blob_sas.cpp + sample/transactional_checksum.cpp ) target_link_libraries(azure-storage-sample PRIVATE azure-storage-blobs) diff --git a/sdk/storage/azure-storage-blobs/sample/transactional_checksum.cpp b/sdk/storage/azure-storage-blobs/sample/transactional_checksum.cpp new file mode 100644 index 000000000..e759db2ef --- /dev/null +++ b/sdk/storage/azure-storage-blobs/sample/transactional_checksum.cpp @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// SPDX-License-Identifier: MIT + +#include + +#include + +#include "samples_common.hpp" + +SAMPLE(TransactionalChecksum, TransactionalChecksum) +void TransactionalChecksum() +{ + using namespace Azure::Storage::Blobs; + + std::string containerName = "sample-container"; + std::string blobName = "sample-blob"; + + auto containerClient + = BlobContainerClient::CreateFromConnectionString(GetConnectionString(), containerName); + containerClient.CreateIfNotExists(); + BlockBlobClient blobClient = containerClient.GetBlockBlobClient(blobName); + + // Upload 1MiB of data and verify with MD5 + std::vector buffer; + buffer.resize(1 * 1024 * 1024); + UploadBlockBlobOptions uploadOptions; + uploadOptions.TransactionalContentHash = Azure::Storage::ContentHash(); + uploadOptions.TransactionalContentHash.Value().Algorithm = Azure::Storage::HashAlgorithm::Md5; + Azure::Core::Cryptography::Md5Hash md5Hash; + md5Hash.Append(buffer.data(), buffer.size()); + uploadOptions.TransactionalContentHash.Value().Value = md5Hash.Final(); + Azure::Core::IO::MemoryBodyStream bodyStream(buffer); + blobClient.Upload(bodyStream, uploadOptions); + + // Download the data and verify with CRC64 + DownloadBlobOptions downloadOptions; + downloadOptions.Range = Azure::Core::Http::HttpRange(); // Have to specify a range, and the range + // cannot be larger than 4MiB + downloadOptions.Range.Value().Offset = 0; + downloadOptions.Range.Value().Length = buffer.size(); + downloadOptions.RangeHashAlgorithm = Azure::Storage::HashAlgorithm::Crc64; + auto downloadResponse = blobClient.Download(downloadOptions); + buffer = downloadResponse.Value.BodyStream->ReadToEnd(); + Azure::Storage::Crc64Hash crc64Hash; + crc64Hash.Append(buffer.data(), buffer.size()); + if (crc64Hash.Final() != downloadResponse.Value.TransactionalContentHash.Value().Value) + { + std::cout << "CRC-64 mismatch" << std::endl; + } + else + { + std::cout << "CRC-64 match" << std::endl; + } +}