Laravel ID主自动增量替代

时间:2019-05-21 13:33:47

标签: php laravel auto-increment id

在我的应用程序中,大多数ID(user_id,classical_id,post_id,assessment_id等)都是公开可用的,这意味着它们位于URL或目录名称中。出于安全原因,我希望每个表格都具有10个字符的随机ID,而不是自动递增的ID。

我可以使用时间戳,但这并不是唯一的时间戳,添加随机数会变得更长(例如,我必须添加4个随机数才能每秒处理一张表最多10.000个DB插入。纯粹是假设它是不可缩放的。

现在,我希望创建一个 10个字符的随机ID ,这将为我提供 100亿个可能的ID组合。因此,生成副本的机会非常小,而且长度也可以接受。

longjmp(3)

您认为我的想法有意义吗?有人知道使用10个字符的主ID是否会对我的数据库性能产生负面影响吗?谢谢!

3 个答案:

答案 0 :(得分:1)

您最好改用insert/update/read restart script insert/update/read/

您使用哪种数据库类型?大多数数据库类型都支持UUID类型,并且可以自动生成它们,因此您不必自己生成它们。

签出: https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid

答案 1 :(得分:0)

我可以建议生成ID的三个软件包。

  1. Webpatser的Laravel UUID软件包
    允许为您的模型生成UUID,设置和使用都非常简单。这种类型的ID是不可预测的,可能被认为更安全,但无法在数据库中进行排序。 Github
  2. Vinkla的Laravel Hashids包
    保留您当前的ID,并获取可解密的哈希,以公开地混淆ID。 Github
  3. Hafael的Laraflake套餐
    Twitter雪花就像ID生成,良好的性能和更好的功能一样,可以对ID进行排序。 Github

您可以查看所有三个可用软件包,然后选择一个,或者可以从中获得启发的DIY解决方案。

答案 2 :(得分:0)

您可以使用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'
];

希望这会有所帮助。