什么字节编码用于计算多部件上传的Amazon-S3 ETag?

时间:2016-05-17 16:40:54

标签: c# amazon-s3 etag

参考此链接中的讨论:

What is the algorithm to compute the Amazon-S3 Etag for a file larger than 5GB?

重新创建MD5哈希的步骤是1)连接每个上传部分的md5哈希,2)将连接的哈希转换为二进制,3)获取二进制的md5哈希,然后4)添加连字符和数字散列的部分。这听起来很容易,但是我在努力的地方是在第3步。要获得二进制的哈希,我需要将字符串转换为字节数组。要获取字节数组,我需要知道要使用的编码格式。那是我失踪的部分。我是否使用ASCII,UTF8,Unicode,BigEndian等?

我尝试过使用上面的四种格式,但没有一种格式产生正确的哈希值。我似乎无法想象这一个。我正在使用的代码是:

CompleteMultipartUploadResponse compResp = new CompleteMultipartUploadResponse();
CompleteMultipartUploadRequest compReq = new CompleteMultipartUploadRequest();
string requestETagHash = "";

compResp = client.CompleteMultipartUpload(compReq);
string compETag = compResp.ETag;                                            
foreach (PartETag s in compReq.PartETags)
{
    requestETagHash += s.ETag.Replace('\"', ' ').Trim().Split('-').First();
}

StringBuilder sb = new StringBuilder();
foreach (char c in requestETagHash)
{
    try
    {
         sb.AppendFormat(Convert.ToString(Convert.ToInt16(c.ToString(), 16), 2).PadLeft(4, '0'));
    }
    catch (Exception ex)
    {
        MessageBox.Show("Hash error:\n\n" + ex.Message);
    }
}
//What encoding is used in this line?
byte[] b = System.Text.Encoding.UTF8.GetBytes(sb.ToString());

byte[] data = md5Hash.ComputeHash(b, 0, b.Length);

StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
    sBuilder.Append(data[i].ToString("x2"));
}

任何解决此问题的人都将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题解决了。谢谢你,乔恩!你关于我得到哈希的评论让我想到了在哪里找到哈希的字节数组与我正在使用的十六进制值。我修改了我的代码,以便在上传每个文件部分后立即获取并连接哈希字节数组。然后,在收到CompleteMultiPartUploadResponse响应后,我对该连接数组进行哈希处理,瞧,我得到与从S3返回的完成上传的eTag相同的哈希值。