创建一个独特且看似随机的5个字符串

Dav*_*vid 6 php mysql unique uniqueidentifier

我正在尝试创建一个简短的5或6个字符的邀请代码,该代码将在我的网站上创建"组"时生成.组信息存储在组表中.希望加入群组的用户必须拥有邀请码 - 他们没有必要知道任何其他内容.

显然,我需要邀请代码是唯一的,我希望在没有仔细检查的情况下生成唯一的字符串,但是弄清楚代码很困难.我一直在阅读几十个问题和答案.这就是我想出来的:

将组信息(例如名称)插入组表时,该行自然会被赋予唯一的自动递增ID.

1)抓住那个id

2)将其添加到1234

3)在将团队名称从base36转换为base10之后,简单地将值放在彼此旁边."NewYorkYankees"是base10(3994055806027582482648)[1263399405580602758248264820130221060827])

4)转换为基数36

5)将代码插入数据库

这保证对每个群体都是独一无二的,对吧?零碰撞的机会?我这样说是因为它根本不是随机的; 我从一些独特的东西开始,我保持它独特,从不引入随机数据.

我有几个问题,因为组名是可重复的,如何在创建/ INSERTion时获取行id?这不起作用,但它就在我所在的地方:

$query = "SELECT id FROM groups WHERE gname = :gname";
...
$uid = $result + '1234';
$hex = md5(":gname NOW()" . uniqid("$uid", true));
base_convert($hex, 10, 36);
intval($str, 36);

$query = "INSERT...";
Run Code Online (Sandbox Code Playgroud)

独特,简短但不可预测,没有所有正确的部分,用户无法使用.

Dav*_*vid 2

$query = "INSERT INTO groups (gname, gadmin) VALUES (:gname, :gadmin)";
    $query_params = array( ':gname' => $trimmed['gname']
                           ':gadmin' => $userid );

    try {
        $stmt = $db->prepare($query);
        $result = $stmt->execute($query_params);
        $gid = $db->lastInsertId();
    }
    catch(PDOException $ex) {
        die("Failed to run query: " . $ex->getMessage());
    }

    // Use this library: https://github.com/ivanakimov/hashids.php
    $hashids = new Hashids\Hashids('this is my constant salt', 5,
                'abcdefghijklmnpqrstuvwxyz0123456789');

    $hash = $hashids->encrypt($gid);

    $query = "UPDATE groups SET invite = '$hash' WHERE id = '$gid'";
    ...
Run Code Online (Sandbox Code Playgroud)

相关图书馆负责处理繁重的工作。它本身实际上并不散列。它对输入进行加密;由于我的行 ID 是唯一的,因此加密结果也是唯一的。我不需要解密“哈希”,但该选项存在。我无法严格定义长度,但我可以设置最小值并有增长的空间。另外,正如您所看到的,它还允许我定义一个“字母表”。