Azure存储文件与本地文件(同一文件)具有不同的MD5校验和

时间:2017-08-04 22:00:06

标签: c# azure md5 checksum cloudfiles

我正在使用can服务将文件上传到Azure存储服务,因此我想使用MD5校验和检查文件的完整性,因此首先我从函数中获取校验和。

public static string GetMD5HashFromFile(Stream stream)
{
    using (var md5 = MD5.Create())
    {
        return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", string.Empty);
    }
}

我正在使用的测试文件:1dffc245282f4e0a45a9584fe90f12f2,当我使用this等在线工具时得到了相同的结果。

然后我将文件上传到Azure并从我的代码中获取它:(为了避免包含验证,我们假设文件和目录确实存在。)

public bool CompareCheckSum(string fileName, string checksum)
{
    this.storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("MyConnectionString"));
    this.fileClient = this.storageAccount.CreateCloudFileClient();
    this.shareReference = this.fileClient.GetShareReference(CloudStorageFileShareSettings.StorageFileShareName);
    this.rootDir = this.shareReference.GetRootDirectoryReference();
    this.directoryReference = this.rootDir.GetDirectoryReference("MyDirectory");
    this.fileReference = this.directoryReference.GetFileReference(fileName);

    Stream stream = new MemoryStream();
    this.fileReference.DownloadToStream(stream);
    string azureFileCheckSum = GetMD5HashFromFile(stream);

    return azureFileCheckSum.ToLower() == checksum.ToLower();
}

我还尝试使用不同的过程来获取校验和:

public bool CompareCheckSum(string fileName, string checksum)
{
    this.storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("MyConnectionString"));
    this.fileClient = this.storageAccount.CreateCloudFileClient();
    this.shareReference = this.fileClient.GetShareReference(CloudStorageFileShareSettings.StorageFileShareName);
    this.rootDir = this.shareReference.GetRootDirectoryReference();
    this.directoryReference = 
    this.rootDir.GetDirectoryReference("MyDirectory");
    this.fileReference = this.directoryReference.GetFileReference(fileName);

    this.fileReference.FetchAttributes();
    string azureFileCheckSum = this.fileReference.Metadata["md5B64"];

    return azureFileCheckSum.ToLower() == checksum.ToLower();  
}

最后,对于azureFileCheckSum我得到:d41d8cd98f00b204e9800998ecf8427e不确定我是否做错了什么或者当我将文件上传到ftp时有什么变化......

1 个答案:

答案 0 :(得分:3)

在致电md5.ComputeHash(stream)之前,您需要将流的位置重置为开头。

stream.Position = 0;

当然,如果流类型不支持搜索,则会因NotSupportedException而失败,但在您的情况下它应该有效。