7
votes

Besoin de hachage MD5 pour un système de mémoire.Drawing.Mage

besoin de hachage MD5 pour un système de mémoire.Drawing.image


4 commentaires

Où êtes-vous coincé? C'est relativement simple.


Le titre ne veut pas 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 les données que vous aurez besoin de hachage, en utilisant presque toutes les réponses ci-dessous.


3 Réponses :


6
votes

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


2 commentaires

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).



3
votes

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


1 commentaires

Je dois dire que cela est bien mis en place ... sur ce que les manuels enseignent également pour les candidats.



1
votes

Merci aux autres boursiers qui ont répondu. Voici ce que j'ai fini par faire: xxx


0 commentaires