besoin de hachage MD5 pour un système de mémoire.Drawing.image p>
3 Réponses :
Voici un extrait de base. Voir aussi le commentaire de @jarerevisser pour certaines questions.
using System.Security.Cryptography; using System.Text; using System.Drawing.Imaging; // ... // get the bytes from the image byte[] bytes = null; using( MemoryStream ms = new MemoryStream() ) { image.Save(ms,ImageFormat.Gif); // gif for example bytes = ms.ToArray(); } // hash the bytes MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] hash = md5.ComputeHash(bytes); // make a hex string of the hash for display or whatever StringBuilder sb = new StringBuilder(); foreach (byte b in hash) { sb.Append(b.ToString("x2").ToLower()); }
Merci de simplement répondre à la question et ne pas dépenser toute votre énergie à vous inquiéter de la raison pour laquelle j'ai besoin de savoir. J'aimerais que plus de gens soient aussi comme si vous. De plus, vous pouvez éviter la boucle StressBuilder et foreach. Voir ma réponse.
La mauvaise chose à propos de cette approche est que l'image.Save () ne fournit pas de résultat uniforme, c'est-à-dire que les hachages ne sont que différentes si l'image est créée par programme (deux instances absolument identiques sont créées à l'aide de graphiques.fromImage et de peinture quelques lignes).
Un échantillon simple, basé sur le Msdn ; Notez que ce hachage dépend de la représentation interne de l'image et ne correspondra pas à la hachage créée à partir d'un fichier.
using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Security.Cryptography; using System.Text; class Program { static string getMd5Hash(byte[] buffer) { MD5 md5Hasher = MD5.Create(); byte[] data = md5Hasher.ComputeHash(buffer); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } return sBuilder.ToString(); } static byte[] imageToByteArray(Image image) { MemoryStream ms = new MemoryStream(); image.Save(ms, ImageFormat.Bmp); return ms.ToArray(); } static void Main(string[] args) { Image image = Image.FromFile(@"C:\tmp\Jellyfish.jpg"); byte[] buffer = imageToByteArray(image); string md5 = getMd5Hash(buffer); } }
Je dois dire que cela est bien mis en place ... sur ce que les manuels enseignent également pour les candidats.
Merci aux autres boursiers qui ont répondu. Voici ce que j'ai fini par faire:
Où êtes-vous coincé? C'est relativement simple.
Le titre ne veut pas I> disent tout ... pourquoi avez-vous besoin d'un hasch? Doit-il être identique au hachage d'un fichier sur disque équivalent? Vraisemblablement, vous allez comparer le hash à quelque chose à un moment donné ...
@Jared - UPLOADSCREENSHOT.com/APIMIMUMITUMENTATION#VARIABLE Maintenant, vous savez ce que je sais: J'ai un système.Drawing.image dans la mémoire et devez envoyer un hachage de MD5 de l'objet image à cette API.
Ok ... de sorte que l'API devrait vraiment appeler le "Hash5 du dossier du fichier en cours de téléchargement", plutôt que de l'image. Vous devrez sérialiser l'image (dans un flux ou un fichier) pour la publier de toute façon, de sorte que c'est i> les données que vous aurez besoin de hachage, en utilisant presque toutes les réponses ci-dessous.