我知道uniqid()
创建许多长度为 7 或更多的唯一 ID 的方法,但我想要创建的是长度为 5 的唯一 ID,没有冲突。
是否可以创建 220.000 个长度为 5 的唯一 ID 并检查是否存在任何冲突?
你可以试试
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)");
测试了 100,000 次并且总是碰撞总是小于 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;
}
看看这篇文章
它解释了如何从您的 bdd id 生成简短的唯一 id,就像 youtube 一样。
实际上,文章中的函数与php 函数 base_convert非常相关,它将一个数字从一个基数转换为另一个数(但最多只能达到 36 个基数)。
我想使用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,这应该可以正常工作!