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

sup*_*ize 1 php mysql

我知道uniqid()创建大量长度为 7 或更长的唯一 id 的方法,但我想要创建的是长度为 5 的唯一 id,不会发生冲突。

是否可以创建 220.000 个长度为 5 的唯一 id 并检查是否存在冲突?

Bab*_*aba 6

你可以试试

for($i = 0; $i < 10 ; $i++)
{
    echo randString(5),PHP_EOL ;
}
Run Code Online (Sandbox Code Playgroud)

输出

7fh96
G93fd
97Q7E
90Wku
7Vby9
4678f
S11oe
67688
19D36
KC1bQ
Run Code Online (Sandbox Code Playgroud)

简单碰撞测试

$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)");
Run Code Online (Sandbox Code Playgroud)

经过 100,000 次测试,冲突始终小于 0.02,这使得该函数对于 5 字符集有效

0.011818181818182% - (26)
Run Code Online (Sandbox Code Playgroud)

使用的功能

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这些不是无冲突的,因此您可以将它们存储为数组键并执行此操作直到您的数组有 220.000 个键 (2认同)