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)
独特,简短但不可预测,没有所有正确的部分,用户无法使用.
$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 是唯一的,因此加密结果也是唯一的。我不需要解密“哈希”,但该选项存在。我无法严格定义长度,但我可以设置最小值并有增长的空间。另外,正如您所看到的,它还允许我定义一个“字母表”。