attla / ulid
Attla和Laravel的通用唯一有序标识符(ULID)实现。
v1.2.3
2024-07-30 04:39 UTC
Requires
- php: >=7.3
Requires (Dev)
- phpbench/phpbench: ^1.1.3
- phpunit/phpunit: ^8.5
- symfony/phpunit-bridge: ^5.1
README
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安全)
- 单调排序顺序(正确检测和处理同一毫秒)
您可以在这里了解更多信息
有什么好处?
- 在分布式系统中,你可以相当自信地认为主键永远不会冲突。
- 当构建大规模应用程序时,自动增长的自动键不理想。
- 它使得复制变得简单(与int相比,后者真的很难)
- 足够安全,不会让用户知道你通过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