Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

The default avatar/identicon is based on an MD5 hash of your e-mail address. With some e-mail providers (e.g., GMail) the address gmailuser+foo@gmail.com is still delivered to gmailuser@gmail.com, so this trick can be used to change the hash of your e-mail and thus get a different identicon, but there is no guarantee that it looks better than the original.

How can we semi-automate the search for your preferred identicon using Mathematica?

share|improve this question
2  
Of course the guaranteed way to get a pretty gravatar is to explicitly set it to a pretty picture. :-) –  celtschk Oct 23 '12 at 15:40
    
@celtschk Not everyone might want to sign up to Gravatar. –  VLC Oct 23 '12 at 15:42
    
By the way, I think Leonid has one of the best generated Gravatars in the system and AFAIK it's for his real email address. –  Mr.Wizard Oct 23 '12 at 17:33
    
This is exactly how I picked my autogenerated gravatar (for those that remember) before I became the hypnotoad –  rm -rf Oct 23 '12 at 19:03
add comment

1 Answer

up vote 14 down vote accepted

With this function a random integer is inserted in the e-mail address (gmailuser@gmail.com becomes gmailuser+randominteger@gmail.com) and then the hash value is computed. The hash value is used to get the corresponding identicon from the Gravatar website. This approach can address also some privacy concerns.

generatePic[email_] := 
 Module[{emailparts, randN, input, inputhash, img},
  emailparts = StringSplit[email, "@"];
  randN = StringJoin["+", ToString[RandomInteger[99999]], "@"];
  input = emailparts[[1]] <> randN <> emailparts[[2]];
  inputhash = IntegerString[Hash[ToLowerCase[input], "MD5"], 16, 32];
  img = Import[
    "http://www.gravatar.com/avatar/" <> inputhash <> 
     "?s=128&d=identicon&r=PG"];
  {img, input}
  ]

If we want to generate some identicons based on a specific e-mail address we just do this:

Grid[Table[generatePic["gmailuser@gmail.com"], {3}]]

identicons

Once we find an identicon we like, we just need to copy/paste the corresponding e-mail address into the e-mail field of the Stack Exchange profile.

Update for Mathematica versions before 8

It seems that older Mathematica versions include the enclosing quotes "" when it generates the hash, but there seems to be a workaround.

StringHash[string_String, type_: "MD5"] := 
 Module[{stream, file, hash}, stream = OpenWrite[];
  WriteString[stream, string];
  file = Close[stream];
  hash = FileHash[file, type];
  DeleteFile[file];
  hash]

And then:

generatePic[email_] := 
 Module[{emailparts, randN, input, inputhash, img}, 
  emailparts = StringSplit[email, "@"];
  randN = StringJoin["+", ToString[RandomInteger[99999]], "@"];
  input = emailparts[[1]] <> randN <> emailparts[[2]];
  inputhash = 
   IntegerString[StringHash[ToLowerCase[input], "MD5"], 16, 32];
  img = Import[
    "http://www.gravatar.com/avatar/" <> inputhash <> 
     "?s=128&d=identicon&r=PG"];
  {img, input}]
share|improve this answer
    
I wish I had thought of this. Nice work! –  Mr.Wizard Oct 23 '12 at 15:36
    
I've got a problem: The avatar produced by your function doesn't match the one I get when I enter the email address in the profile here on StackExchange. –  Mr.Wizard Oct 23 '12 at 15:49
    
@Mr.Wizard I've tried several gmail addresses and they always matched. I'll try to see where the problem could be. –  VLC Oct 23 '12 at 16:00
    
Then either it's my problem or v7 hash works differently. I'll look again. –  Mr.Wizard Oct 23 '12 at 16:03
    
I tried another one and it also did not match. Then I tried one from the picture in your answer and it did. Would you please post the inputhash value you get for several addresses? –  Mr.Wizard Oct 23 '12 at 16:07
show 9 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.