ID生成算法类似于youtube';s世代


ID Generating algorithm similar to youtube's generation

我正在为轮询生成随机ID;出于显而易见的原因,我删除了枚举ID。我已经制作了自己的生成ID的功能,但我不确定它是否非常"优化",或者我做得不对。一旦我的民调接近64^6(可能永远不会发生),它就会落后。这很好吗?

function generateID()
{
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_';
    $id = $this->injectionCSC('$' . substr(str_shuffle($chars), 15, 10), true);
    $link = $this->connect();
    $query = mysqli_query($link, "SELECT * FROM polls WHERE id='$id'");
    if (mysqli_num_rows($query) > 0) {
        $id = $this->generateID();
    }
    return $this->injectionCSC($id, false);
}

$this->injectionCSC($id,false/true);只是一个摆脱sql注入和html标记的函数。如果我说得对的话,这个当前的ID生成函数最多可以容纳1.8014399e+16个轮询。为了增加数量,我可以更改前面的特殊字符('$'),也可以添加另一个字符。

不要使用伪随机数生成器来生成您的唯一id,而是选择UUID。

UUIDv4是唯一的,极不可能发生冲突,这与str_shuffle实现不同。您可以使用ramsey/uid包来完成此操作。写起来很简单:

$uuid4 = (string) Uuid::uuid4(); // something like 16fd2706-8baf-433b-82eb-8c7fada847da

您可以使用base64:对原始字节进行编码

$id = base64_encode(Uuid::uuid4()->getBytes());