如何在PHP中生成非常独特的id


How to generate very unique id in PHP

我正在使用自制的许可证生成器,并希望使用唯一函数来生成一些许可证字符串

我已经可以生成一些id,但由于我截断它们以避免第一部分始终相同,我想仔细检查生成的id是否已经存在于数据库中。

我对php很陌生,所以如果能帮助我创建这个函数,我将非常感激

我已经这样做了:

substr(uniqid($lic_key_prefix, true), 7);

我想要一个函数,将查看数据库的递归方式,直到它找到一个非常独特的id到我的数据库项目。

谁有提示?

如果您所做的只是试图阻止人们猜测下一个ID或从uniqid()的输出中学习特定模式,那么截断它并不是一个好主意。我以前也做过类似的事情,我选择了Hashids。它根据你给它的任何整数生成双向哈希,输出字符串与其他字符串完全无关,除非知道秘密字符串,否则不可能根据当前值确定下一个值。

// Include necessary files:
require_once('lib/Hashids/HashGenerator.php');
require_once('lib/Hashids/Hashids.php');
// First you set a secret string. Change this to whatever you want.
$secret = 'my_secret_string';
// Then create a hash starting with 2 characters for the first one.
// This will get longer as the id increases.
$hashids = new Hashids'Hashids($secret, 2);
// Create the first 20 hashes based on IDs 0 to 19
for ($i=0; $i<20; $i++) {
    echo $hashids->encode($i) . "'n";
}
// Or if you want each hash to be a minimum of 32 characters:
$hashids = new Hashids'Hashids($secret, 32);
for ($i=0; $i<20; $i++) {
    echo $hashids->encode($i) . "'n";
}

下面是上面的输出:

Yb
JE
oZ
n1
OX
QO
vx
X4
xP
k8
Wx
V9
mz
DL
wA
Eo
4B
1Z
8W
zE
eXZ9L0gO1Bvwx7qYblQbop5VAzDRn2M3
e8RWd7PjMQZGbLaJElmkAyEJn5gY2zDV
QKJMW3XEZ1vzgjqoZNA6G9xmpO8rV0nP
RE3p0moweBK1XAqn1NvG4bjnMD5Z89kV
rKEvgR5Y2djmp7aOXNnbzO8xXQVe0WMB
zeLmYjv0AG3MK7lQON1QopRJODB5w48E
8WoLRyJngvZY63Nvxlwp7ed5MrPVBm4j
EOvxdnV3kB9jP2aX4am5bGyXRwzLo4ZD
YrAvRL7dKV4WxQNxPN1bM3yXog58D9BJ
yJ3WQ6ZR1Bk75eNk8q0mPb8K4dxwMYGA
OVbKy1GBmzpewXqWxlARP02M57nx43Zk
vDxbYGWOJyQ5rmqV9NLoBez6137VPEXR
Qwn6LPjx8g0XzBqmzlbde7EW2RrpkGKM
Gzk5MRXm78JQ1rqDLqY0Kx2go4dnB3Ee
V0p7Z2QwjdeY5RqwAazMWvJPnokKAb1D
BAYjp5DOJnVKgXNEolkGMQx7Rm2weor6
OXrPA8VRJkzvbWN4BlnG4QBeDxM15L0K
r7QEdMoJW8Gzgxl1Za12eK4vOYLR5Vb9
57ZVbnWOjQJGdBl8WqXYL8w61Ey2Kxp4
omOyWjPJ71Dk30qzENBZY26Mr9dAVgbE

当然,您可以将任何散列解码回常规整数。因此,您需要做的就是将数据库中的ID传递给这个函数,并将其提供给客户机。然后,当客户端向您提供哈希时,您将其放入decode方法中并获得实际的ID。这样,如果截断的uniqid已经存在,您就不需要担心尝试执行多个查询,因为hashid保证是唯一的。

您可以向数据库中的id字段添加唯一键,然后在插入时检查是否成功。如果没有,请更改唯一id,然后再次插入。将其放入循环中,直到成功为止。这将保证每个id都是唯一的。