我正在尝试为在我的网站上创建的每个用户帐户创建一个“确认代码”,并将其与个人信息一起存储在数据库中。正如您在下面的示例中所看到的,我尝试在时间变量中生成随机字符串因子,但是,字符串是不必要的长。
我希望字符串比md5
生成的字符串短。我想知道是否有一种相对简单的方法来生成具有极低冲突率的10位(最大)字母数字字符串?
我尝试了什么:
md5(mt_rand(10000,99999).time() . 'example@domain.com');
输出:
0dd6854dba19e70cfda0ab91595e0376
答案 0 :(得分:3)
PHP提供openssl_random_pseudo_bytes
功能,可以安全地执行您想要的操作。
做类似的事情:
bin2hex(openssl_random_pseudo_bytes(5))
上面的内容会为您提供类似e9d196aa14
的内容。
或者,只需获取现有MD5字符串的前10个字符。
答案 1 :(得分:1)
答案 2 :(得分:0)
这将生成来自Aa-Zz
和0-9
个字符的任意随机输出字符串。
function genString($length) {
$lowercase = "qwertyuiopasdfghjklzxcvbnm";
$uppercase = "ASDFGHJKLZXCVBNMQWERTYUIOP";
$numbers = "1234567890";
$specialcharacters = "{}[];:,./<>?_+~!@#";
$randomCode = "";
mt_srand(crc32(microtime()));
$max = strlen($lowercase) - 1;
for ($x = 0; $x < abs($length/3); $x++) {
$randomCode .= $lowercase{mt_rand(0, $max)};
}
$max = strlen($uppercase) - 1;
for ($x = 0; $x < abs($length/3); $x++) {
$randomCode .= $uppercase{mt_rand(0, $max)};
}
$max = strlen($specialcharacters) - 1;
for ($x = 0; $x < abs($length/3); $x++) {
$randomCode .= $specialcharacters{mt_rand(0, $max)};
}
$max = strlen($numbers) - 1;
for ($x = 0; $x < abs($length/3); $x++) {
$randomCode .= $numbers{mt_rand(0, $max)};
}
return str_shuffle($randomCode);
}
用法
$str = genString(10);
答案 3 :(得分:0)
我认为最好的方法是
$random = substr(number_format(time() * rand(),0,'',''),0,10); // you can increase the digits by changing 10 to desired digit
请查看
答案 4 :(得分:-1)