我知道uniqid()
方法可以创建长度为7或更多的唯一ID,但我想创建的是5个唯一ID的长度,没有碰撞。
是否可以创建长度为5的220.000个唯一ID并检查是否有任何碰撞?
答案 0 :(得分:4)
你可以尝试
for($i = 0; $i < 10 ; $i++)
{
echo randString(5),PHP_EOL ;
}
输出
7fh96
G93fd
97Q7E
90Wku
7Vby9
4678f
S11oe
67688
19D36
KC1bQ
简单碰撞测试
$hash = array();
$collision = 0;
while ( count($hash) < 220000 ) {
$r = randString(5);
if (isset($hash[$r])) {
$collision ++;
continue;
}
$hash[$r] = 1;
}
print(($collision / 220000) * 100 . "% - ($collision)");
Tested 100,000 times and always collision is always less that 0.02使函数对5个字符集有效
0.011818181818182% - (26)
使用的功能
function randString($length) {
$char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$char = str_shuffle($char);
for($i = 0, $rand = '', $l = strlen($char) - 1; $i < $length; $i ++) {
$rand .= $char{mt_rand(0, $l)};
}
return $rand;
}
答案 1 :(得分:0)
看一下这篇文章
它解释了如何从你的bdd id中生成短的唯一ID,就像youtube一样。
实际上,文章中的函数与php function base_convert非常相关,{{3}}将数字从基数转换为另一个(但最多只能基数为36)。
答案 2 :(得分:0)
我想使用uniqid()
函数来制作特定长度的字符串。因此,我进行了实验并提出了以下代码:
<?php
$number = uniqid();
$varray = str_split($number);
$len = sizeof($varray);
$otp = array_slice($varray, $len-5, $len);
$otp = implode(",", $otp);
$otp = str_replace(',', '', $otp);
print_r($otp);
?>
这对我来说很好,只要你的网站没有以非常快的速度生成OTP,这应该可以正常工作!