# Tutorial :PHP function to create 8 chars long hash ([a-z] = no numbers allowed) ### Question:

I need PHP function that will create 8 chars long [a-z] hash from any input string. So e.g. when I'll submit "Stack Overflow" it will return e.g. "gdqreaxc" (8 chars [a-z] no numbers allowed)

### Solution:1

Perhaps something like:

``\$hash = substr(strtolower(preg_replace('/[0-9_\/]+/','',base64_encode(sha1(\$input)))),0,8);  ``

This produces a SHA1 hash, base-64 encodes it (giving us the full alphabet), removes non-alpha chars, lowercases it, and truncates it.

For `\$input = 'yar!';`:

`mwinzewn`

For `\$input = 'yar!!';`:

`yzzhzwjj`

So the spread seems pretty good.

### Solution:2

This function will generate a hash containing evenly distributed characters `[a-z]`:

``function my_hash(\$string, \$length = 8) {        // Convert to a string which may contain only characters [0-9a-p]      \$hash = base_convert(md5(\$string), 16, 26);        // Get part of the string      \$hash = substr(\$hash, -\$length);        // In rare cases it will be too short, add zeroes      \$hash = str_pad(\$hash, \$length, '0', STR_PAD_LEFT);        // Convert character set from [0-9a-p] to [a-z]      \$hash = strtr(\$hash, '0123456789', 'qrstuvwxyz');        return \$hash;  }  ``

By the way, if this is important for you, for 100,000 different strings you'll have ~2% chance of hash collision (for a 8 chars long hash), and for a million of strings this chance rises up to ~90%, if my math is correct.

### Solution:3

``function md5toabc(\$myMD5)  {     \$newString = "";     for (\$i = 0; \$i < 16; \$i+=2)     {          //add the first val of 0-15 to the second val of 0-15 for a range of 0-30            \$myintval = hexdec(substr(\$myMD5, \$i, \$i +1) )  +                       hexdec(substr(\$myMD5, \$i+1, \$i +2) );          // mod by 26 and add 97 to get to the lowercase ascii range                  \$newString .= chr((\$myintval%26) + 97);     }     return \$newString;  }  ``

Note this introduces bias to various characters, but do with it what you will. (Like when you roll two dice, the most common value is a 7 combined...) plus the modulo, etc...

### Solution:4

one can give you a good a-p{8} (but not a-z) by using and modifying (the output of) a well known algo:

``function mini_hash( \$string )  {    \$h = hash( 'crc32' , \$string );    for(\$i=0;\$i<8;\$i++) {      \$h{\$i} = chr(96+hexdec(\$h{\$i}));    }    return \$h;  }  ``

interesting set of constraints you posted there

### Solution:5

``substr (preg_replace(md5(\$mystring), "/[1-9]/", ""), 0, 8 );  ``

you could add a bit more entorpy by doing a

``preg_replace(\$myString, "1", "g");  preg_replace(\$myString, "2", "h");  preg_replace(\$myString, "3", "i");  ``

etc instead of stripping the digits.

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »