【发布时间】:2016-09-13 21:35:01
【问题描述】:
参考此链接中的讨论:
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"));
}
任何解决此问题的人将不胜感激。
【问题讨论】:
-
您如何上传实际数据?根本不清楚文本在哪里出现。
-
请注意您链接到的问题:“由于 MD5 校验和是二进制数据的十六进制表示,请确保您采用解码后的二进制连接的 MD5”
-
基本上听起来你这样做太晚了 - 你应该将每个 MD5 哈希计算为
byte[],然后 a) 将这些byte[]哈希连接在一起(这样你就可以对结果进行哈希处理再次); b) 将每个散列转换为 etag 的十六进制。 -
谢谢,乔恩。我打算评论代码以更清楚地说明发生了什么,但似乎无法弄清楚如何做到这一点。关于你引用的注释,这就是让我绊倒的原因,也是我将哈希(十六进制)转换为二进制的原因。里面有一块我没有得到。
-
哈希不是以十六进制开始的。您还没有显示计算数据哈希值的代码。 (您似乎在开始时就提出了请求,这很奇怪......通常您会在提出请求之前这样做,不是吗?)