Laravel ID主要自动增量替代方案



在我的应用程序中,大多数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生成三个软件包。

  1. WebPatser的Laravel UUID软件包
    允许为您的模型生成UUID,非常简单地设置和使用。这种类型的ID是不可预测的,可能被认为更安全,但不能在数据库中进行排序。github
  2. Vinkla的Laravel Hashids软件包
    保持您当前的ID并获得可以解密的哈希,以公开混淆ID。github
  3. 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'
];

希望这会有所帮助。

最新更新