symfony/uid 格式转换一次讲透:binary、base32、base58 与 RFC 9562 完全手册 📅 发布时间:2026/8/27 16:05:49 👁 浏览次数: symfony/uid 格式转换一次讲透binary、base32、base58 与 RFC 9562 完全手册【免费下载链接】uidProvides an object-oriented API to generate and represent UIDs项目地址: https://gitcode.com/gh_mirrors/ui/uidsymfony/uid 是 Symfony 提供的 PHP UID 组件提供面向对象 API 来生成和表示 UUID 与 ULID。它内置了 binary16 字节二进制、base3226 位 Crockford 编码、base5822 位与 RFC 9562/412236 位带连字符四种格式的完整转换能力一个对象即可在任意格式之间无损互转。四种 UID 编码格式速查表同一个 128 位标识符在不同场景下有不同的长相。symfony/uid 支持以下四种标准格式格式长度字符集典型示例适合场景binary16 字节原始二进制0x09748193…hex 视图数据库 BINARY(16)、存储最紧凑base3226 字符0-9、A-Z 去掉 I L O U09EJ0S614A9FXVG9C5537Q9ZE1ULID 规范格式可排序base5822 字符去掉 0、O、I、l 的 Base582AifFTC3zXgZzK5fPrrprLURL 友好、最短的人类可读编码RFC 9562/412236 字符十六进制 连字符09748193-048a-4bfb-b825-8528cf74fdc1UUID 规范格式、最广泛的互操作 记忆口诀binary 最省空间base58 最短base32 是 ULID 的母语RFC 9562 是 UUID 的母语。转换的核心思路一切以 binary 为枢纽symfony/uid 的设计非常清晰所有转换都通过toBinary()拿到 16 字节的原始数据再编码为目标格式。这个逻辑集中体现在 AbstractUid.php 中toBase58()先取 binary再经 BinaryUtil.php 的多进制算法编码toBase32()binary 转 hex 后再分段 base_convert 到 32 进制toRfc4122()binary 转 hex 后插入 4 个连字符按 8-4-4-4-12 分段toHex()额外返回带0x前缀的十六进制视图方便日志排查。而输入方向同样打通静态方法fromString()能自动识别你传入的是哪种格式——36 位带连字符按 RFC 9562 解析、22 位 Base58 字符按 base58 解析、26 位 Crockford 字符按 base32 解析。这就是Uuid::fromString()和Ulid::fromString()在 Uuid.php、Ulid.php 中实现的智能识别能力。// 同一个标识符四种写法自由切换 $uuid Uuid::fromString(09748193-048a-4bfb-b825-8528cf74fdc1); // RFC 9562 $uuid-toBase58(); // 2AifFTC3zXgZzK5fPrrprL $uuid-toBase32(); // 09EJ0S614A9FXVG9C5537Q9ZE1 $uuid-toHex(); // 0x09748193048a4bfbb8258528cf74fdc1FORMAT 常量校验时指定输入格式当格式需要显式声明时例如字符串长度恰好撞车时symfony/uid 用位掩码常量来指定定义见 Ulid.php 与 Uuid.php常量含义FORMAT_BINARY16 字节二进制串FORMAT_BASE_3226 字符 Base32FORMAT_BASE_5822 字符 Base58FORMAT_RFC_4122/FORMAT_RFC_956236 字符 RFC 格式两者等价FORMAT_ALL全部接受自动嗅探典型用法是isValid()// 默认只按 RFC 9562 校验 Uuid::isValid(09748193-048a-4bfb-b825-8528cf74fdc1); // true Uuid::isValid(2AifFTC3zXgZzK5fPrrprL); // false默认格式不匹配 Uuid::isValid(2AifFTC3zXgZzK5fPrrprL, Uuid::FORMAT_BASE_58); // trueULID 与 UUID 的转换差异要注意ULID 的母语是 base3226 位 Crockford 编码中前 10 位内嵌了 48 位毫秒时间戳因此 base32 格式天然可字典序排序见 Tests/UlidTest.php 中对生成顺序的断言。ULID 还有两个特殊值NilUlid全零00000000000000000000000000MaxUlid全Z的7ZZZZZZZZZZZZZZZZZZZZZZZZZUUID 的母语是 RFC 956236 位小写带连字符由 NilUuid.php 和 MaxUuid.php 提供对应的 nil / max 特殊值。一个实用技巧ULID 与 UUID 之间可以互相转换因为它们底层都是 128 位// 用 UUID 的 RFC 9562 字符串直接构造一个 ULID $ulid Ulid::fromString(01771535-b29c-b898-923b-b5a981f5e417);反之亦然26 位 base32 的 ULID 也可以被Uuid::fromString()接受。命令行一键转换ulid:inspect 与 uuid:inspect不想手写转换代码项目自带两个 Symfony Console 命令输入任意格式的标识符一次性输出全部格式php bin/console ulid:inspect 01EWAKBCMWQ2C94EXNN60ZBS0Q php bin/console uuid:inspect a7613e0a-5986-11eb-a861-2bf05af69e52输出表格会同时给出 base32规范格式、base58、rfc4122、hex 四种表示时间型 UID 还会附带上生成时间UTC。实现分别在 Command/InspectUlidCommand.php 和 Command/InspectUuidCommand.php。生成侧同样支持指定输出格式比如ulid:generate --formatrfc4122直接输出 RFC 格式见 Command/GenerateUlidCommand.php。格式选型建议与常见坑你的场景推荐格式理由数据库主键存储binaryBINARY 16仅 16 字节索引最省对外 API / URL 参数base5822 位最短无易混淆字符需要可排序 IDbase32 ULID前 10 位即时间戳字典序 时间序与外部系统互操作RFC 9562生态通用标准⚠️ 几个容易踩的坑base32 用的是 Crockford 变体——字母表是0-9A-Z去掉I、L、O、U不要和 RFC 4648 标准 Base32含 I 不含 L 的另一套混用长度也不同26 vs 32。base58 是大小写敏感的且全零的 nil 值会编码为 22 个1见 AbstractUid.php 中toBase58()用1填充的细节。FORMAT_RFC_4122与FORMAT_RFC_9562是同一个常量因为 RFC 9562 只是对 RFC 4122 的修订扩展。时间型 UIDUuidV1/V6/V7、Ulid实现了 TimeBasedUidInterface.phpgetDateTime()反解出的时间精度分别为微秒和毫秒注意别混谈。总结symfony/uid 把 128 位标识符的四种编码格式完全打通输入靠fromString()自动嗅探输出靠toBinary()/toBase32()/toBase58()/toRfc4122()任意切换校验时用FORMAT_*常量精确控制CLI 的ulid:inspect、uuid:inspect则让你随时肉眼核对转换结果。掌握这套格式转换体系后无论 ID 出现在日志、URL 还是数据库里你都能一眼认出它的真身。【免费下载链接】uidProvides an object-oriented API to generate and represent UIDs项目地址: https://gitcode.com/gh_mirrors/ui/uid创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考