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 生成包。

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

希望这对您有所帮助。