attla/ulid

Attla和Laravel的通用唯一有序标识符(ULID)实现。

v1.2.3 2024-07-30 04:39 UTC

This package is auto-updated.

Last update: 2024-08-30 04:51:08 UTC


README

License Latest Stable Version Total Downloads

A PHP port of ulid/javascript with some minor improvements.

通用唯一有序标识符

UUID在许多情况下可能不是最佳选择,因为

  • 它不是编码128位随机性的最高字符效率方式
  • UUID v1/v2在许多环境中不切实际,因为它需要访问唯一的、稳定的MAC地址
  • UUID v3/v5需要唯一的种子并生成随机分布的ID,这可能导致许多数据结构中的碎片化
  • UUID v4仅提供随机性信息,这可能导致许多数据结构中的碎片化

因此,此处提出了ULID

  • 128位与UUID兼容
  • 每毫秒1.21e+24个唯一的ULID
  • 可按字典顺序排序!
  • 规范编码为26个字符的字符串,而不是36个字符的UUID
  • 使用Crockford的base32以获得更好的效率和可读性(每字符5位)
  • 不区分大小写
  • 无特殊字符(URL安全)
  • 单调排序顺序(正确检测和处理同一毫秒)

您可以在这里了解更多信息

有什么好处?

  1. 在分布式系统中,你可以相当自信地认为主键永远不会冲突。
  2. 当构建大规模应用程序时,自动增长的自动键不理想。
  3. 它使得复制变得简单(与int相比,后者真的很难)
  4. 足够安全,不会让用户知道你通过id获取信息,例如https://example.com/item/10

安装

composer require attla/ulid

用法

use Attla\Ulid\Factory as UlidFactory;

$ulid = UlidFactory::generate();
echo $ulid; // 01B8KYR6G8BC61CE8R6K2T16HY
echo $ulid->generate(); // 01B8KYR6G8BC61CE8R6K2T16HZ

// Or if you prefer a lowercased output
$ulid = UlidFactory::generate(true);
echo $ulid->get(); // 01b8kyr6g8bc61ce8r6k2t16hy

// If you need the timestamp from an ULID instance
$ulid = UlidFactory::generate();
echo $ulid->toTimestamp(); // 1561622862

// You can also generate a ULID for a specific UNIX-time in milliseconds
$ulid = UlidFactory::fromTimestamp(1593048767015);
// or with a lower cased output: $ulid = UlidFactory::fromTimestamp(1593048767015, true);
echo $ulid->toString(); // 01EBMHP6H7TT1Q4B7CA018K5MQ

使用方法get()toString()从ULID实例获取ULID字符串。

迁移

当使用迁移时,应将 $table->increments('id') 或 $table->id() 更改为

$table->ulid();

简单来说,模式看起来像这样。

Schema::create('items', function (Blueprint $table) {
  $table->ulid();
  ....
  ....
  $table->timestamps();
});

如果相关模型使用ULID,则列类型也应反映这一点。

Schema::create('items', function (Blueprint $table) {
  $table->ulid();
  ....
  // related model that uses ULID
  $table->foreignUlid('category_id');
  ....
  $table->timestamps();
});

ULID蓝图参数是可选的。但以下是如何使用它的示例。

Schema::create('categories', function (Blueprint $table) {
  $table->ulid($ulidLength);
  ....
  // related model that uses ULID
  $table->foreignUlid($column, $foreignColumn, $foreignTable, $ulidLength);
  ....
  $table->timestamps();
});

模型

要设置一个使用ULID的模型,只需使用HasUlid特性。

use Illuminate\Database\Eloquent\Model;
use Attla\Ulid\HasUlid;

class Item extends Model
{
  use HasUlid;
}

控制器

当你创建一个使用ULIDs的模型的新实例时,此包会自动将ULID添加为模型的id。

// 'HasUlid' trait will automatically generate and assign id field.
$item = Item::create(['name' => 'Awesome item']);
echo $item->id;
// 01brh9q9amqp7mt7xqqb6b5k58

测试

composer test

基准测试

composer benchmark

许可证

本软件包采用MIT许可证授权 © Octha