Generating random string based on some hex
short answer: you can't
longr answer:
a md5 hashsum contains 128 bits of information, so to store that you also need 128 bits. the closest you get from that to a human readable form would probably be to base64 encode it, that will leave you with 22 characters (24 with padding). that's probably as short as it gets.*

where does the randomness in your md5 hash come from anyway? md5 hashes arn't random, so you're probably hashing something random (what?) to get them (and by doing so you can't increase the entropy in any way, only decrease it).

*you could probably create you own way to encode the checksum using a larger range of characters from the unicode range... but that would mean you had to select a suitable set of characters that anybody will know how to pronounce...
something like ☺ ⚓ ⚔ ☂ ☏ would seem fairly clear, but some symbols like ♨ no so much...
I have a md5 checksum in python; like s = '14966ba801aed57c2771c7487c7b194a'.
What I want is to shorten it and make it a string in the form 'a-zA-Z0-9_.-', without loosing entropy of my random md5 checksum.
The output have to be pronounceable, so I cant just do binascii.unhexlify(s). Nor can I do base64.encodestring(s) and cut it because then I will loose entropy.
Any ideas on how to solve this without mapping an insane number (256) of hex pair (00->FF) to different letters?
The reason I want this is to be able to say a whole md5 checksum over the phone, but use the whole alphabet+numbers+some special characters.