Generating an unguessable token for confirmation e-mails
You want unguessable randomness. Then, use unguessable randomness. Use openssl_random_pseudo_bytes()
which will plug into the local cryptographically strong PRNG. Don't use rand()
or mt_rand()
, since these are predictable (mt_rand()
is statistically good but it does not hold against sentient attackers). Don't compromise, use a good PRNG. Don't try to make something yourself by throwing in hash function and the like; only sorrow lies at the end of this path.
Generate 16 bytes, then encode them into a string if you need a string. bin2hex()
encodes in hexadecimal; 16 bytes become 32 characters. base64_encode()
encodes in Base64; 16 bytes become 24 characters (the last two of which being '=' signs).
16 bytes is 128 bits, that's the "safe value" making collisions so utterly improbable that you don't need to worry about them. Don't go below that unless you have a good reason (and, even then, don't go below 16 anyway).
Make sure you have OpenSSL support, and you'll never go wrong with this one-liner
$token = bin2hex(openssl_random_pseudo_bytes(16));