请参考此链接中的讨论:
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"));
}任何人在解决这个问题上都将不胜感激。
发布于 2016-05-18 03:27:57
问题解决了。谢谢,乔恩!你关于我延迟获取散列的评论让我思考在哪里可以找到散列的字节数组和我正在使用的十六进制值。我修改了我的代码,在上传每个文件部分后立即获得并连接散列字节数组。然后,在接收到CompleteMultiPartUploadResponse响应后,我对连接的数组进行散列,结果,我得到的散列与从S3返回的完成上传的eTag的散列相同。
https://stackoverflow.com/questions/37281979
复制相似问题