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

时间:2015-05-20 20:28:52

标签: php

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

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

我对php很陌生,所以有一个litlle帮助创建这个功能真的很感激

我已经这样做了:

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

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

任何人都有提示吗?

3 个答案:

答案 0 :(得分:3)

如果您正在尝试阻止人们猜测下一个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传递给此函数并将其提供给客户端。然后,当客户端为您提供hashid时,您将其放入decode方法并获取实际ID。这样,如果截断的uniqid已经存在,您不必担心尝试执行多个查询,因为保证hashids是唯一的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

看着哈希德后,我似乎无法找到 GitHub中的HashGenerator.php文件。 Hashids.php在那里,但是另一个文件并没有查看上面的include,这是必需的。我希望我能在不使用作曲家的情况下将其放入我的项目中。