php 中的短唯一 ID

2022-08-30 10:14:11

我想创建一个唯一的ID,但给出类似.我想要的是类似于tinyurl给出的东西:.越短越好。唯一的要求是它不应该有一个明显的顺序,它应该看起来比一个看似随机的数字序列更漂亮。字母优先于数字,理想情况下不会是混合大小写。由于条目的数量不会那么多(最多10000个左右),因此碰撞的风险不是一个很大的因素。uniqid()'492607b0ee414''64k8ra'

任何建议都值得赞赏。


答案 1

创建一个小函数,返回给定长度的随机字母:

<?php
function generate_random_letters($length) {
    $random = '';
    for ($i = 0; $i < $length; $i++) {
        $random .= chr(rand(ord('a'), ord('z')));
    }
    return $random;
}

然后,您需要调用它,直到它是唯一的,在伪代码中,具体取决于您存储该信息的位置:

do {
    $unique = generate_random_letters(6);
} while (is_in_table($unique));
add_to_table($unique);

您可能还需要确保字母不会在字典中形成单词。可能是整个英语词典,或者只是一个坏词词典,以避免客户发现不好的味道。

编辑:我也会补充说,这只有在你打算使用它的情况下才有意义,因为它不适合大量的项目,因为你可能会得到更多的冲突(获取表中已有的ID)的速度会变得非常慢。当然,您需要一个索引表,并且需要调整 ID 中的字母数以避免冲突。在这种情况下,对于6个字母,您将有26 ^ 6 = 308915776个可能的唯一ID(减去坏单词),这应该足以满足您10000的需求。

编辑:如果你想要字母和数字的组合,你可以使用以下代码:

$random .= rand(0, 1) ? rand(0, 9) : chr(rand(ord('a'), ord('z')));

答案 2

@gen_uuid() by gord.

preg_replace遇到了一些令人讨厌的utf-8问题,这导致uid有时包含“+”或“/”。要解决这个问题,你必须明确地使模式utf-8

function gen_uuid($len=8) {

    $hex = md5("yourSaltHere" . uniqid("", true));

    $pack = pack('H*', $hex);
    $tmp =  base64_encode($pack);

    $uid = preg_replace("#(*UTF8)[^A-Za-z0-9]#", "", $tmp);

    $len = max(4, min(128, $len));

    while (strlen($uid) < $len)
        $uid .= gen_uuid(22);

    return substr($uid, 0, $len);
}

我花了很长时间才发现,也许它节省了其他人的头痛


推荐