繁体   English   中英

什么字节编码用于计算分段上传的 Amazon-S3 ETag?

[英]What byte encoding is used to compute the Amazon-S3 ETag for multi-part uploads?

参考此链接中的讨论:

为大于 5GB 的文件计算 Amazon-S3 Etag 的算法是什么?

重新创建 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"));
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM