Laravel ObjectId 性能最强体积最小的分布式 UUID 生成扩展

news/2025/11/12 8:05:23/文章来源:https://www.cnblogs.com/catchadmin/p/19212147

Laravel ObjectId 性能最强体积最小的分布式 UUID 生成扩展

相信每位 Laravel 开发者都遇到过这种情况:新建项目、写迁移、模型默认用自增 ID。开始挺好,但等到系统要上分布式、对接 API、搞微服务的时候,整数 ID 的局限性就暴露出来了。

Laravel ObjectId 就是为了解决这个问题:一套开箱即用的全局唯一 ID 方案,借鉴了 MongoDB ObjectId 的设计思路,可以直接用在 MySQL、MariaDB 和 PostgreSQL 上,不需要装 MongoDB。

原文链接 Laravel ObjectId 性能最强体积最小的分布式 UUID 生成扩展

为什么要用 ObjectId?

和 UUID、ULID 比起来,ObjectId 只有 12 字节,里面包含了时间戳、随机值和计数器,所以天然可排序、体积小、跨系统唯一。

性能数据很直观:生成速度是 UUID 的 3 倍,占用空间更小,直接拉升数据库性能和索引效率。

  • 原生支持 MySQL、MariaDB 和 PostgreSQL
  • 不依赖 MongoDB 驱动或扩展

ObjectId 内部结构

ObjectId 是个 12 字节(96 位)的标识符,分成四个部分:

组成部分 占用空间 说明
时间戳 4 字节 UNIX 时间戳秒数,保证 ID 按时间排序
机器标识 5 字节 随机生成,每台机器不同
进程 ID 2 字节 标识当前进程
自增计数器 3 字节 每个进程独立计数,初始值随机

总共:4 + 5 + 2 + 3 = 12 字节 = 24 位十六进制字符

这个设计的好处是不需要中心化的 ID 生成服务就能保证唯一性,还能按时间顺序排列,特别适合分布式系统。

扩展阅读:

  • MongoDB ObjectId 官方文档
  • Percona 关于 ObjectId 的深度解析
  • Stack Overflow 上的 ObjectId 结构分析

相关包

这个 Laravel 扩展包依赖了一个核心 PHP 库:

  • wooserv/php-objectid:纯 PHP 实现,不依赖任何扩展
  • wooserv/laravel-objectid:Laravel 集成包,支持自动 ID 分配和迁移宏

两个包都是开源的,MIT 协议,WooServ Labs 出品。

安装

composer require wooserv/laravel-objectid

使用方式

在模型中使用

use WooServ\LaravelObjectId\Concerns\HasObjectIds;
use Illuminate\Database\Eloquent\Model;class Post extends Model
{use HasObjectIds;
}

迁移文件写法

Schema::create('posts', function (Blueprint $table) {$table->objectId(); // Creates a 24-char string primary key$table->string('title');$table->timestamps();
});

手动生成 ID

$id = objectid(); // e.g. 6730b6a0d8a28f890b7c9f40

性能测试

ID 生成速度(10,000 次)

----------------------------------------------------------
ObjectId             : 0.412 µs per ID
objectid() helper    : 0.417 µs per ID
UUID                 : 1.283 µs per ID
ULID                 : 1.147 µs per ID
----------------------------------------------------------
结论:ObjectId 最快

数据库插入速度(1,000 条)

----------------------------------------------------------
ObjectId   : 14.78 ms total (0.015 ms/insert)
UUID       : 15.48 ms total (0.015 ms/insert)
ULID       : 15.17 ms total (0.015 ms/insert)
----------------------------------------------------------

三者对比

对比项 ObjectId UUID ULID
字符串长度 24 字符 36 字符 26 字符
字节数 12 16 16
时间排序 支持 不支持 支持
随机性 支持 支持 支持
可读性 简洁 冗长 适中
生成速度 最快 最慢 中等
MySQL/MariaDB/PostgreSQL 支持 支持 支持 支持
是否需要 MongoDB 不需要 不需要 不需要

总结: ObjectId 在体积、性能和时间排序上做到了最好的平衡,而且可以直接用在传统 SQL 数据库上。

核心优势

  • 自动分配,不用手动生成 ID
  • 迁移宏 $table->objectId() 写起来很舒服
  • 核心库独立,不绑定 Laravel 框架
  • 体积小,比 UUID 省数据库空间
  • 自带时间戳,ID 天然按时间排序
  • 兼容主流数据库:MySQL、MariaDB、PostgreSQL

关于开源

这两个包都采用 MIT 协议,由 WooServ Labs 团队维护。这个团队专注于为现代 Web 应用打造开放、高性能的 PHP 工具。

我们对开源的理解:

  • 安装要简单
  • 使用要舒服
  • 性能要给力

认同这些想法的话,欢迎给仓库点星、提交代码,或者推荐给其他开发者。

相关链接

  • Laravel ObjectId GitHub 仓库
  • PHP ObjectId GitHub 仓库
  • MongoDB ObjectId 参考文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k6 nats 测试扩展

k6 nats 测试扩展实际上社区已经有一个扩展了,但是因为时间比较长了,与新版本的k6 已经不兼容了,我进行了调整了可以更好的支持新版本 参考修改k6使用的底层js 引擎,新版本使用了grafana/sobek 对于golang nats cl…

在线调试查看天气和快递

1.打开万维易源,点击“API市场”,打开下方的“天气预报”2.先购买0元包,再点击“在线调试”,弹出下方页面3.将http请求更改为get,删掉areaCode的值,并将area改为地名,点击“调用接口”1.打开万维易源,点击“AP…

一场论坛捕捉 26 年语音 AI 关键词:思考机制、专有模型、低功耗、超低帧率、多语种、语音增强……丨RTE2025 回顾

在 Convo AI & RTE2025 大会上,来自产业界和学术界的多位专家深入探讨了智能语音技术、大模型时代的语音交互范式变革及其在实时互动场景中的挑战与机遇。科大讯飞寰语 AI 研究院副院长孟廷、声网音频体验与方案负…

2025年11月EGUOO营养包价格贵:稀缺原料与诺奖科研背书下的价值拆解

2025年11月,当消费者在小红书输入“EGUOO营养包价格贵”时,后台瞬间跳出十万加笔记,高频关键词集中在“值不值”“是不是智商税”“同类价差十倍”。这种集体疑问背后,是都市白领、银发一族和健身爱好者共同的决策…

2025年7月EGUOO营养包价格贵推荐:从成分奢侈品到健康投资品路径

开场白 “每天吞一把平价胶囊,体检报告却年年红灯”——这是不少职场人在体检中心排队时的共同叹息。当肝脏指标、抗氧化能力、肠道菌群失衡同时亮起警报,消费者开始追问:低价补充剂到底缺了什么?EGUOO营养包因定价…

微软正式发布 .NET 10:三年 LTS 支持驱动性能革命与 AI 原生开发新纪元

微软公司(北京时间2025 年 11 月 12 日,西雅图)在 .NET Conf 2025 在线大会上,隆重宣布 .NET 10 正式发布,博客文章详见:https://devblogs.microsoft.com/dotnet/announcing-dotnet-10/。这是一个具有里程碑意义…

AI元人文:构建文明级认知纠缠体的操作系统

AI元人文:构建文明级认知纠缠体的操作系统 我们正站在文明演化的奇点。在全球化与数字化的双重浪潮中,不同文明的价值冲突日益凸显,而人工智能的崛起正在催生一个全新的文明形态。AI元人文构想应运而生,它不仅是解…

Skia 在龙芯搭景嘉微显卡设备 某些字体会渲染相互覆盖

此问题是先在 Avalonia 应用上发现的,后续调查了解到是 Skia 底层的问题。本文将记录此问题和提供规避方法以下是我的一个 Avalonia 应用上的文本渲染效果。使用 HarmonyOS Sans SC 鸿蒙字体,在龙芯 Loongson-3A6000…

Git命令提交

Git代码提交完整指南:从基础命令到高级技巧 Git代码提交的核心流程 Git代码提交的标准流程可以概括为四个关键步骤:修改文件 → 暂存变更 → 提交到本地仓库 → 推送到远程仓库。根据搜索结果和最佳实践,以下是完整…

习题解析之:求数列前n项的平方和

习题解析之:求数列前n项的平方和【问题描述】现有数列:1,2,3,4,……,n,计算并输出其前n项的平方和,即求:11+22+33+……+nn的和。 输入输入一个正整数 n 输出数列前n项的平方和 示例输入3输出14 【编程思…

应用安全 --- vp加固 之 jar字节码加密

应用安全 --- vp加固 之 jar字节码加密https://gitee.com/null_465_7266/vp-reinforcement 这里是加密样本 他会将class文件的魔术改为BABECAFE8000,这里的8表示加密文件,同时将每个方法的字节码按位加密

习题解析之:出租车计费

习题解析之:出租车计费【问题描述】某城市出租车计费标准如下:(1)起步里程为3公里(含3公里),起步费13元;(2)载客里程3~15公里范围的,除起步费外,超过3公里的部分按基本单价2.3元/公里计算;(3)载客里程超过…

画家的命运

挪威奥斯陆是一座很美丽的城市,它有大海,有蓝天,还有各种可爱的男孩与女孩。某个夜晚,星空璀璨,一个来自月球的外星人驾驶他的宇宙飞船,降临此地。他步姿优雅地从飞船下来,摇着他的白色手杖,朝着地面一指,瞬时…

从微软应用商店外部获取直链下载程序包的方法

访问 https://store.rg-adguard.net在链接输入框中输入微软应用商店应用链接 例如 https://apps.microsoft.com/detail/9p1wcd1p597r从下拉列表中选择 Retail 以获取稳定版本 说明:这里下拉列表有 4 个选项,释义参考…

侧载安装 .msixbundle 程序包的两种方法

重要提示:操作前请保存当前正在进行的工作! 方式 1:通过 PowerShell 脚本安装 运行脚本 解压缩下载的 .zip 文件,右键单击 install.ps1,选择 使用 PowerShell 运行。授权安装证书 按 回车 键继续,并同意弹出窗口…

致敬杰克逊的音乐

黑暗灯光的舞台 女孩为什么偷偷笑我 仿佛有个男孩的影子 就是他 可爱哦,可笑哦,可怜哦,可悲哦,可恨哦…… 但上面这行文字偏偏与他无关 因为怹太了不起了 诗画乐初恋 The Mass 他邀请你阅读他写的武侠小说,神幻六…