2016-05-17 13 views
0

Reference Die Diskussion in diesem Link:Welche Byte-Codierung wird verwendet, um den Amazon-S3 ETag für mehrteilige Uploads zu berechnen?

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

Die Schritte der MD5-Hash ist auf 1) verketten die md5 Hash-Werte für jedes Ladeteil, 2) wandeln die verketteten Hash in binäre, 3) nachzubilden erhalten der MD5-Hash der Binärdatei, dann 4) fügen Sie den Bindestrich und die Anzahl der Teile zum Hash hinzu. Das hört sich alles einfach an, aber wo ich kämpfe, ist in Schritt 3. Um den Hash der Binärdatei zu erhalten, muss ich die Zeichenfolge in ein Byte-Array konvertieren. Um das Byte-Array zu erhalten, muss ich wissen, welches Kodierungsformat verwendet werden soll. Das ist der Teil, den ich vermisse. Benutzt ich ASCII, UTF8, Unicode, BigEndian, etwas anderes?

Ich habe versucht, die vier oben genannten Formate und keiner hat den richtigen Hash erzeugt. Ich kann es einfach nicht verstehen. Der Code, den ich benutze ist:

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")); 
} 

Irgendwelche in der Lösung dieses würde geschätzt werden.

+0

Wie laden Sie die eigentlichen Daten hoch? Es ist nicht klar, wo Text überhaupt herkommt. –

+0

Hinweis zu der Frage, mit der Sie verknüpft sind: "Da MD5-Prüfsummen hexadezimale Darstellungen binärer Daten sind, stellen Sie sicher, dass Sie MD5 der dekodierten binären Verkettung verwenden" –

+0

Im Grunde hört es sich so an, als ob Sie das zu spät tun - Sie sollten rechnen jeder MD5-Hash als ein "Byte []", dann a) das Zusammenführen dieser 'Byte []' Hashes zusammen (so können Sie das Ergebnis erneut hashen); b) Umwandeln jedes Hash in hex für das etag. –

Antwort

0

Problem gelöst. Danke, Jon! Ihr Kommentar, dass ich den Hash zu spät bekommen habe, brachte mich dazu, darüber nachzudenken, wo ich das Byte-Array des Hashs finden konnte, im Gegensatz zum Hex-Wert, den ich verwendete. Ich änderte meinen Code, um das Hash-Byte-Array unmittelbar nach dem Hochladen jedes Dateiteils zu erhalten und zu verketten. Nach dem Empfang der CompleteMultiPartUploadResponse-Antwort hasse ich dann dieses verkettete Array, und voila, ich bekomme den gleichen Hash wie das eTag, das von S3 für den abgeschlossenen Upload zurückgegeben wurde.