Требуется хэш MD5 для хранения в памяти System.Drawing.Image
Вот базовый фрагмент. См. Также комментарий @JaredReisinger для некоторых вопросов.
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());
}
Простой пример, основанный на примере в MSDN; обратите внимание, что этот хэш зависит от внутреннего представления изображения и не будет соответствовать хэшу, созданному из файла.
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);
}
}
Чтобы иметь возможность использовать класс MD5
, необходимо добавить ссылку на System.Security
.
В зависимости от того, для чего вы собираетесь использовать хэш, следует учитывать тот факт, что MD5 больше не является передовым методом и что существуют лучшие хэш-функции, если вам нужен сильный хэш.
Спасибо другим ребятам, которые ответили. Вот что я в итоге сделал:
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();