C#: How to generate short MD5 code?
c#, cryptography, hash, md5
Solution
I like @RichieHindle's answer. However, if you're interested in losing fewer bits of fidelity (and thereby decreasing the risk of collisions), you could take the 128 bit value returned by the MD5 Hash, and encode it using ASCII85 (also known as Base85 encoding), instead of a hexadecimal-based encoding. This will give you the whole hash in 20 bytes (which is more than you wanted, but you could chop 2 bytes off, resulting in much less loss than removing 14 of the 32 bytes you'd get using hex encoding).
Edit: Prashant says 20 characters is close enough, and asked for sample code:
After obtaining the MD5 hash from the MD5.ComputeHash call, you can use Jeff Atwood's ASCII85 encoder:
MD5 m = MD5.Create();
byte[] hash = m.ComputeHash(System.Text.Encoding.ASCII.GetBytes("23"));
Ascii85 encoder = new Ascii85();
encoder.EnforceMarks = false;
string hash85 = encoder.Encode(hash);
Console.Out.WriteLine(hash85);
Yields
2ebDPFFZsD?&,r1fX\$,
so you can just use `hash85`. The `encoder.EnforceMarks` makes sure that the encoding doesn't include some typical prefix and suffixes that are associated with ASCII85.
Problem
When I am encrypting `23` using MD5 encryption I am getting `37693cfc748049e45d87b8c7d8b9aacd` this 32-character long string which will always be static for 23. I want the same kind of mechanism but that should generate 18 or less (like: `122ff1e4883358b6`) characters long string instead 32. How I can do that in C#, is there any shorter version of MD5 in c#??