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

如何在PHP中生成非常唯一的id,php,Php,我正在使用自制的许可证生成器,并希望使用uniqid函数生成一些许可证字符串 我已经可以生成一些id,但由于我正在截断它们以避免第一部分始终保持不变,我想再次检查生成的id是否已经存在于数据库中 我对php非常陌生,因此如果您能帮我创建这个函数,我将不胜感激 我已经这样做了: substr(uniqid($lic_key_prefix, true), 7); 我想要一个函数,它将以递归的方式查看数据库,直到它找到我的数据库项的唯一id为止 有人有提示吗?您可以在数据库的id字段中添加一个唯一的

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

我已经可以生成一些id,但由于我正在截断它们以避免第一部分始终保持不变,我想再次检查生成的id是否已经存在于数据库中

我对php非常陌生,因此如果您能帮我创建这个函数,我将不胜感激

我已经这样做了:

substr(uniqid($lic_key_prefix, true), 7);
我想要一个函数,它将以递归的方式查看数据库,直到它找到我的数据库项的唯一id为止


有人有提示吗?

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

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

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

// 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";
}

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

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

// 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";
}

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

只需执行ID=$uniquid的数据库查询。重复此操作,直到查询不返回任何行。通过截断uniqid来截断它确实会删除它的有用性。只需在该字段上为表指定一个唯一的约束,这样就不可能插入重复。只需执行id=$uniquid的数据库查询。重复此操作,直到查询不返回任何行。通过截断uniqid来截断uniqid确实会删除它的有用性。只需在该字段上给表一个唯一的约束,这样就不可能插入重复。这实际上可能比检查字符串是否已经存在更好,因为您减少了添加此字段所需的查询量记录这实际上可能比检查字符串是否已经存在更好,因为您减少了添加此记录所需的查询量。不幸的是,我还是一个新手,无法在php代码中使用此类哈希ID。是的,这是为了防止人们猜测下一个ID或从uniqid的输出中学习特定的模式。。。我想我应该使用非截断的uniqid。也许让我的应用程序允许有限的尝试次数有助于避免猜测。右侧有一条粗体的大消息警告此函数不会创建随机或不可预测的字符串。此功能不得用于安全目的。使用加密安全的随机函数/生成器和加密安全的哈希函数创建不可预知的安全ID。因此,你应该注意这个警告,而不是用它来做你想做的事情。如果您想尝试一下Hashids,并且遇到任何问题,请在这里回复。事实上,它使用起来非常简单。不幸的是,我还是一个新手,无法在php代码中使用这种哈希ID。是的,这是为了防止人们猜测下一个ID或从uniqid的输出中学习特定的模式。。。我想我应该使用非截断的uniqid。也许只是让我的应用程序允许有限数量的 尝试可能有助于避免猜测。右侧有一条粗体的大消息警告此函数不会创建随机或不可预测的字符串。此功能不得用于安全目的。使用加密安全的随机函数/生成器和加密安全的哈希函数创建不可预知的安全ID。因此,你应该注意这个警告,而不是用它来做你想做的事情。如果您想尝试一下Hashids,并且遇到任何问题,请在这里回复。它实际上很容易使用。