我正在尝试为在我的网站上创建的每个用户帐户创建一个"确认码",并将其与个人信息一起存储在数据库中。正如您在下面的示例中看到的,我尝试在时间变量中生成一个随机字符串因子,但是,字符串不必要地长。
我希望字符串比md5
产生的字符串短 我想知道是否有一种相对简单的方法来生成冲突率极低的 10 位(最大)字母数字字符串?
我尝试过:
md5(mt_rand(10000,99999).time() . 'example@domain.com');
输出:
0dd6854dba19e70cfda0ab91595e0376
PHP提供了openssl_random_pseudo_bytes
函数,可以安全地做你想做的事情。
执行以下操作:
bin2hex(openssl_random_pseudo_bytes(5))
上面会给你一些类似的东西 e9d196aa14
,例如。
或者,只需获取现有 MD5 字符串的前 10 个字符。
http://php.net/manual/en/function.uniqid.php
+
http://br.php.net/manual/en/function.substr.php
这将生成来自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);
我认为最好的方法是
$random = substr(number_format(time() * rand(),0,'',''),0,10); // you can increase the digits by changing 10 to desired digit
请检查一下
尝试使用 http://php.net/manual/en/function.str-split.php