2

我知道uniqid()创建许多长度为 7 或更多的唯一 ID 的方法,但我想要创建的是长度为 5 的唯一 ID,没有冲突。

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

4

3 回答 3

7

你可以试试

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;
}
于 2013-03-04T09:41:49.323 回答
0

看看这篇文章

它解释了如何从您的 bdd id 生成简短的唯一 id,就像 youtube 一样。

实际上,文章中的函数与php 函数 base_convert非常相关,它将一个数字从一个基数转换为另一个数(但最多只能达到 36 个基数)。

于 2014-02-20T13:39:28.473 回答
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,这应该可以正常工作!

于 2017-12-13T09:33:29.517 回答