首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHP中生成非常唯一的id

问如何在PHP中生成非常唯一的id
EN

Stack Overflow用户
提问于 2015-05-21 04:28:52
回答 2查看 951关注 0票数 1

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

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

我是php的新手,所以如果能提供一点帮助来创建这个函数,我将不胜感激。

我已经这样做了:

代码语言:javascript
复制
substr(uniqid($lic_key_prefix, true), 7);

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

有谁有提示吗?

EN

回答 2

Stack Overflow用户

发布于 2015-05-21 04:51:04

如果您所做的一切都是为了防止人们猜测下一个ID或从uniqid()的输出中学习特定模式,那么截断它不是一个好主意。我之前不得不做一些类似的事情,我最终选择了Hashids。它根据给定的整数生成双向散列,并且输出字符串与其他字符串完全无关,除非知道秘密字符串,否则不可能根据当前值确定下一个值。

代码语言:javascript
复制
// 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";
}

下面是上面的输出:

代码语言:javascript
复制
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已经存在,您就不必担心尝试执行多个查询,因为hashid保证是唯一的。

票数 4
EN

Stack Overflow用户

发布于 2015-05-21 04:34:55

您可以在数据库的id字段中添加一个唯一键,然后在插入时检查是否成功。如果不是,请更改唯一id,然后重新插入。将它放在一个循环中,直到它成功。这将保证每个id都是唯一的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30359769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档