需要在c#中计算存储在Azure存储中的文件的SHA1哈希值

raj*_*ola 4 c# azure azure-storage azure-blob-storage

我正在将大文件(1-10 GB)上传到azure存储,并且需要在上传时计算文件的SHA1哈希值。我是否可以在服务器上计算 SHA1,而无需下载文件?

Pet*_*Pan 5

Azure Blob 存储支持在放入 blob 时自动对 blob 进行 MD5 哈希计算,请参见Get Blob Properties.

\n\n
\n

内容-MD5

\n\n

如果已为 blob 设置了 Content-MD5 标头,则会返回此响应标头,以便客户端可以检查消息内容完整性。\n 在版本 2012-02-12 及更高版本中,Put Blob 设置块 blob\xe2\ x80\x99s MD5 值,即使 Put Blob 请求不\xe2\x80\x99t 包含 MD5 标头也是如此。

\n
\n\n

因此,如果没有特殊需要,则无需计算 blob 的 SHA1 哈希值。

\n\n

作为参考,这里是一个计算 SHA1 哈希值的示例,无需下载存储在存储中的 blob。

\n\n

同步

\n\n
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("<StorageAccountConnectionString>");\nCloudBlobClient     blobClient     = storageAccount.CreateCloudBlobClient();\nCloudBlobContainer  container      = blobClient.GetContainerReference("<container-name>");\nCloudBlob           blob           = container.GetBlobReference("<blob-name>");\n\nusing(Stream blobStream = blob.OpenRead())\n{\n    using (SHA1 sha1 = SHA1.Create())\n    {\n        byte[] checksum = sha1.ComputeHash(blobStream);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

异步:

\n\n
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("<StorageAccountConnectionString>");\nCloudBlobClient     blobClient     = storageAccount.CreateCloudBlobClient();\nCloudBlobContainer  container      = blobClient.GetContainerReference("<container-name>");\nCloudBlob           blob           = container.GetBlobReference("<blob-name>");\n\nusing(Stream blobStream = await blob.OpenReadAsync().ConfigureAwait(false))\n{\n    using (SHA1 sha1 = SHA1.Create())\n    {\n        byte[] checksum = await sha1.ComputeHashAsync(blobStream);\n    }\n}\n\n// ComputeHashAsync extension method from https://www.tabsoverspaces.com/233439-computehashasync-for-sha1\npublic static async Task<Byte[]> ComputeHashAsync(this HashAlgorithm algo, Stream stream, Int32 bufferSize = 4096)\n{\n    algo.Initialize();\n\n    var buffer = new byte[bufferSize];\n    var streamLength = inputStream.Length;\n    while (true)\n    {\n        var read = await inputStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);\n        if (inputStream.Position == streamLength)\n        {\n            algo.TransformFinalBlock(buffer, 0, read);\n            break;\n        }\n        algo.TransformBlock(buffer, 0, read, default(byte[]), default(int));\n    }\n\n    return algo.Hash;\n} \n
Run Code Online (Sandbox Code Playgroud)\n

  • 不管写了什么,这个示例都会下载 blob;它只是不将其写入磁盘。 (11认同)