在我的应用程序中,大多数ID(user_id,classroom_id,post_id,essutment_id等(公开可用,这意味着它们在URL或目录的名称中。出于安全原因,我想为每个表有10个字符的随机ID,而不是自动递增的ID。
我可以使用时间戳,但这并不是真正唯一的,并且添加了随机数,它将变得更长(例如,我必须添加4个随机数以将高达10.000 db的插入物处理到每秒的表中。。纯粹是假设的(。
现在,我更喜欢创建 10个字符随机ID ,这会给我 100亿可能的ID组合。因此,生成重复的机会很小,长度也可以接受。
use Keygen;
$id = Keygen::numeric(10)->generate();
您认为我的想法有意义吗?有人知道使用10个字符的主要ID是否会对我的DB性能产生负面影响?谢谢!
我可以为ID生成三个软件包。
-
WebPatser的Laravel UUID软件包
允许为您的模型生成UUID,非常简单地设置和使用。这种类型的ID是不可预测的,可能被认为更安全,但不能在数据库中进行排序。github -
Vinkla的Laravel Hashids软件包
保持您当前的ID并获得可以解密的哈希,以公开混淆ID。github -
Hafael的Laraflake软件包
Twitter Snowflake等ID生成,良好的性能和更好的功能,可以分类ID。github
您可以查看所有三个可用的软件包,然后选择一个包裹,也可以从其中启发DIY解决方案。
您最好改用UUID
。
您使用哪种数据库类型?大多数数据库类型都支持UUID类型,并且可以自动生成它们,因此您不必自己生成它们。
查看:https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid
您可以使用UUID。我建议您使用默认的Laravel字符串助手方法生成UUID。请参阅下面有关如何实现这一目标的信息。
use IlluminateSupportStr;
$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'
];
希望这会有所帮助。