2010-08-04 14 views
6

bisogno MD5 hash per un in System.Drawing.Image memoriabisogno MD5 hash per un in System.Drawing.Image memoria

+0

Dove sei bloccato? È relativamente semplice. –

+1

Il titolo * non * dice tutto ... perché hai bisogno di un hash? Deve essere identico all'hash di un file su disco equivalente? Presumibilmente, a un certo punto, paragonerai l'hash a qualcosa ... – JaredReisinger

+0

@Jared - http://uploadscreenshot.com/api-documentation#variables Ora, sai cosa so: ho un System.Drawing .Immagine in memoria e necessario inviare un hash MD5 dell'oggetto Immagine a tale API. –

risposta

5

Ecco un frammento di base. Vedi anche il commento di @JaredReisinger per alcune domande.

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

Non dovrebbe leggere "foreach (byte b in hash)'? –

+0

oops, grazie :) –

+1

Grazie per aver risposto alla domanda e non aver speso tutte le tue energie preoccupandoti del motivo per cui ho bisogno di sapere. Vorrei che più persone su SO fossero più come te. Inoltre, puoi evitare il ciclo StringBuilder e foreach. Vedi la mia risposta. –

2

Un semplice esempio, basato su sample in MSDN; si noti che questo hash dipende dalla rappresentazione interna dell'immagine e non corrisponderà all'hash creato da un file.

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

Per essere in grado di utilizzare la classe MD5 è necessario aggiungere un riferimento a System.Security.

A seconda dell'utilizzo dell'hash, è necessario considerare il fatto che MD5 non è più all'avanguardia e che sono disponibili migliori funzioni di hash se è necessario un hash forte.

+0

Devo dire che questo è ben messo insieme .... con ciò che i libri di testo insegnano anche agli esaminatori. – IbrarMumtaz

1

Grazie agli altri utenti che hanno risposto. Ecco cosa ho finito per fare:

MemoryStream ms = new MemoryStream() 
image.Save(ms, ImageFormat.Png); 
byte[] imgBytes = ms.ToArray(); 

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
byte[] hash = md5.ComputeHash(imgBytes); 
string imageMD5 = BitConverter.ToString(hash).Replace("-", "").ToLower(); 
ms.Dispose(); 
Problemi correlati