J'écris une routine C# qui crée des hachages à partir de fichiers jpg. Si je passe dans un tableau d'octets à mon objet SHA512 alors j'obtiens le comportement attendu, cependant, si je passe dans un flux de mémoire, les deux fichiers ont toujours la même valeur.Pourquoi ces deux fichiers ont-ils la même valeur lorsque j'utilise MemoryStream?
Exemple 1:
SHA512 mySHA512 = SHA512.Create();
Image img1 = Image.FromFile(@"d:\img1.jpg");
Image img2 = Image.FromFile(@"d:\img2.jpg");
MemoryStream ms1 = new MemoryStream();
MemoryStream ms2 = new MemoryStream();
img1.Save(ms1, ImageFormat.Jpeg);
byte[] buf1 = ms1.GetBuffer();
byte[] hash1 = mySHA512.ComputeHash(buf1);
img2.Save(ms2, ImageFormat.Jpeg);
byte[] buf2 = ms2.GetBuffer();
byte[] hash2 = mySHA512.ComputeHash(buf2);
if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
MessageBox.Show("Hashed the same");
else
MessageBox.Show("Different hashes");
qui produit "différentes hash". Mais l'une des surcharges de la méthode ComputeHash prend un objet stream et je préfère l'utiliser. Quand je fais:
SHA512 mySHA512 = SHA512.Create();
Image img1 = Image.FromFile(@"d:\img1.jpg");
Image img2 = Image.FromFile(@"d:\img2.jpg");
MemoryStream ms1 = new MemoryStream();
MemoryStream ms2 = new MemoryStream();
img1.Save(ms1, ImageFormat.Jpeg);
byte[] hash1 = mySHA512.ComputeHash(ms1);
img2.Save(ms2, ImageFormat.Jpeg);
byte[] hash2 = mySHA512.ComputeHash(ms2);
if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
MessageBox.Show("Hashed the same");
else
MessageBox.Show("Different hashes");
Cela produit "Hashed le même".
Que se passe-t-il ici?
Ce ne sont pas des copies de l'image _same_, n'est-ce pas? –
Que se passe-t-il si vous recherchez le début du flux après l'appel .Save? par exemple. ms1.Seek (0, SeekOrigin.Begin); – Joe
Dans ce cas, vous pouvez utiliser 'mySHA512.ComputeHash.ComputeHash (ms1.GetBuffer(), 0, (int) ms1.Length)'. Évite les copies inutiles – CodesInChaos