在PHP中创建长度为5的唯一ID

时间:2013-03-04 09:24:30

标签: php mysql

我知道uniqid()方法可以创建长度为7或更多的唯一ID,但我想创建的是5个唯一ID的长度,没有碰撞。

是否可以创建长度为5的220.000个唯一ID并检查是否有任何碰撞?

3 个答案:

答案 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,这应该可以正常工作!