using System; using System.Security.Cryptography; using System.Text; using AutoMapper; public class GravatarUrlResolver : IValueResolver { const string GravatarUrlFormat = "http://www.gravatar.com/avatar/{0}"; static readonly Uri DefaultUrl = new Uri("http://www.gravatar.com/avatar/?d=identicon"); public ResolutionResult Resolve(ResolutionResult source) { if (source == null) throw new ArgumentNullException("source"); var url = GetGravatarUrl(source.Value as string); return new ResolutionResult(url); } public Uri GetGravatarUrl(string email) { if (String.IsNullOrEmpty(email)) return DefaultUrl; string emailHash = GetHash(email); return new Uri(String.Format(GravatarUrlFormat, emailHash)); } string GetHash(string value) { byte[] bytes = Encoding.ASCII.GetBytes(value.ToLower().Trim()); byte[] hash; using (HashAlgorithm md5 = new MD5CryptoServiceProvider()) hash = md5.ComputeHash(bytes); var hashAsHex = new StringBuilder(); Array.ForEach(hash, b => hashAsHex.Append(b.ToString("X2"))); return hashAsHex.ToString().ToLower(); } }