Laravel ID 主自增备选
Laravel ID primary auto increment alternative
在我的应用程序中,大多数 ID(user_id、classroom_id、post_id、assessment_id 等等)都是公开可用的,这意味着它们要么在URL 或目录名称。出于安全原因,我希望每个 table 都有 10 个字符的随机 ID,而不是自动递增的 ID。
我可以使用时间戳,但这并不是真正唯一的,并且添加随机数会变得更长(例如,我必须添加 4 个随机数才能处理多达 10.000 个数据库插入 table每秒......纯粹是假设它是不可扩展的)。
现在我更愿意创建一个 10 个字符的随机 ID,这会给我 100 亿种可能的 ID 组合。所以产生重复的机会很小,长度也是acceptable。
use Keygen;
$id = Keygen::numeric(10)->generate();
你觉得我的想法有道理吗?有谁知道使用 10 个字符的主 ID 是否会对我的数据库性能产生负面影响?谢谢!
您最好改用 UUID
。
您使用什么数据库类型?大多数数据库类型都支持 UUID 类型,并且可以自动生成它们,因此您不必自己生成它们。
查看:
https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid
我可以推荐三个 ID 生成包。
- Webpatser 的 Laravel UUID 包
允许为您的模型生成 UUID,设置和使用相当简单。这种类型的 id 是不可预测的,可能被认为更安全,但不能在您的数据库中排序。
Github
- Vinkla 的 Laravel Hashids 包
保留您当前的 ID 并获取可以解密的哈希值以公开混淆 ID。 Github
- Hafael 的 Laraflake 包
Twitter snowflake like id generation,性能好,特性好,ids可以排序。 Github
您可以查看所有三个可用的包,然后选择一个,或者您可以根据这些包的灵感制作一个 DIY 解决方案。
您可以使用 UUID。我建议您使用默认的 Laravel 字符串辅助方法来生成 UUID。请参阅下文了解如何实现这一目标。
use Illuminate\Support\Str;
$uuid = Str::uuid()->toString(); //this generates a v4 UUID.
在您的迁移中,您可以像这样指定一个 uuid
列;
**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->uuid('id')->primary(); //uuid field set to PK
});
}
在您的模型中,假设 User.php
,设置以下属性。
protected $primaryKey = 'id';
public $incrementing = false;
protected $keyType = 'string';
我确实建议,您在表中保留一个自动增量列,以帮助您确定记录数而无需编写任何查询(这是可选的)。例如。假设这样的列是 rowId
,您可以通过将其添加到模型的隐藏属性数组中来隐藏您的响应。例如
protected $hidden = [
'password', 'remember_token', 'rowId'
];
希望这对您有所帮助。
在我的应用程序中,大多数 ID(user_id、classroom_id、post_id、assessment_id 等等)都是公开可用的,这意味着它们要么在URL 或目录名称。出于安全原因,我希望每个 table 都有 10 个字符的随机 ID,而不是自动递增的 ID。
我可以使用时间戳,但这并不是真正唯一的,并且添加随机数会变得更长(例如,我必须添加 4 个随机数才能处理多达 10.000 个数据库插入 table每秒......纯粹是假设它是不可扩展的)。
现在我更愿意创建一个 10 个字符的随机 ID,这会给我 100 亿种可能的 ID 组合。所以产生重复的机会很小,长度也是acceptable。
use Keygen;
$id = Keygen::numeric(10)->generate();
你觉得我的想法有道理吗?有谁知道使用 10 个字符的主 ID 是否会对我的数据库性能产生负面影响?谢谢!
您最好改用 UUID
。
您使用什么数据库类型?大多数数据库类型都支持 UUID 类型,并且可以自动生成它们,因此您不必自己生成它们。
查看: https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid
我可以推荐三个 ID 生成包。
- Webpatser 的 Laravel UUID 包
允许为您的模型生成 UUID,设置和使用相当简单。这种类型的 id 是不可预测的,可能被认为更安全,但不能在您的数据库中排序。 Github - Vinkla 的 Laravel Hashids 包
保留您当前的 ID 并获取可以解密的哈希值以公开混淆 ID。 Github - Hafael 的 Laraflake 包
Twitter snowflake like id generation,性能好,特性好,ids可以排序。 Github
您可以查看所有三个可用的包,然后选择一个,或者您可以根据这些包的灵感制作一个 DIY 解决方案。
您可以使用 UUID。我建议您使用默认的 Laravel 字符串辅助方法来生成 UUID。请参阅下文了解如何实现这一目标。
use Illuminate\Support\Str;
$uuid = Str::uuid()->toString(); //this generates a v4 UUID.
在您的迁移中,您可以像这样指定一个 uuid
列;
**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->uuid('id')->primary(); //uuid field set to PK
});
}
在您的模型中,假设 User.php
,设置以下属性。
protected $primaryKey = 'id';
public $incrementing = false;
protected $keyType = 'string';
我确实建议,您在表中保留一个自动增量列,以帮助您确定记录数而无需编写任何查询(这是可选的)。例如。假设这样的列是 rowId
,您可以通过将其添加到模型的隐藏属性数组中来隐藏您的响应。例如
protected $hidden = [
'password', 'remember_token', 'rowId'
];
希望这对您有所帮助。