linkorb/xuid

PHP的XUID库

v1.4.0 2021-02-18 12:39 UTC

This package is auto-updated.

Last update: 2024-08-26 05:49:34 UTC


README

XUIDs是URL友好的压缩UUIDs www.xuid.org

为什么使用XUIDs?

UUID v4是一个很好的选择,用作数据库表的主键。

但是,它们在URL和数据库中使用起来相当长:32个字母数字字符和四个连字符(总共36个字符)

XUID是一个UUID,转换成一个128位值,转换成一个base64字符串(去除填充字符),然后转换成URL安全的base64(将+/分别替换为-_ - 可用自定义映射,下面有更多信息)。

这为您提供了一个22个字符的字符串,可以在URL中使用。

它还可以安全地解码回完整的UUID字符串。

优点

  • 在数据库字段中占用空间更少
  • 更短的URL
  • URL中的不可猜测的主键

使用方法

use Xuid\Xuid;

$xuid = new Xuid();

$in = $xuid->getUuid(); // ffe25f31-907e-46c0-b2f8-8bbfedb9082b

$tmp = $xuid->encode($in); // _-JfMZB-RsCy-Iu_7bkIKw

$out = $xuid->decode($tmp); // ffe25f31-907e-46c0-b2f8-8bbfedb9082b

$tmp = $xuid->getXuid();

$newXuid = $xuid->getXuid();
if (!$xuid->isValidXuid($newXuid)) {
    // this Xuid is valid
}

所有方法也可以静态调用

use Xuid\Xuid;

$x = Xuid::getXuid();
$u = Xuid::decode($x);

示例

您可以在example/目录中找到示例代码。

要生成100个XUID,运行以下命令

php example/generate.php

示例输出

y9G-jWmYQcW5HyxiU_Pnew: cbd1be8d-6998-41c5-b91f-2c6253f3e77b
IOnEowPFR-G74hEBtTSJVQ: 20e9c4a3-03c5-47e1-bbe2-1101b5348955
Jgn4-Hs3STyNMC_ectX4kA: 2609f8f8-7b37-493c-8d30-2fde72d5f890
-rO6xKQFQCGPozxJf35lGw: fab3bac4-a405-4021-8fa3-3c497f7e651b
c6l3fR3mThSlL1OlNYgCvg: 73a9777d-1de6-4e14-a52f-53a5358802be
3PK9eo00T92z6oSsFNCY-A: dcf2bd7a-8d34-4fdd-b3ea-84ac14d098f8
vCMyGdkGT-m6e6m4BKcfgA: bc233219-d906-4fe9-ba7b-a9b804a71f80
JJ_1Ndd3S9SwG9urLr5NTQ: 249ff535-d777-4bd4-b01b-dbab2ebe4d4d
KSn-sn-cToydyfvjLZHhBA: 2929feb2-7f9c-4e8c-9dc9-fbe32d91e104
fi_nfoXrQ_GoYrzT4oZqRw: 7e2fe77e-85eb-43f1-a862-bcd3e2866a47
1vKKRSlHQICMj5X5iktHZA: d6f28a45-2947-4080-8c8f-95f98a4b4764
yWJ5VPsISbS46anoEO2HVQ: c9627954-fb08-49b4-b8e9-a9e810ed8755
...etc

仅生成代数XUID

-_有时会出现在XUID中。如果您更喜欢仅包含代数的XUID,请在生成XUID之前简单调用以下静态方法

Xuid\Xuid::alphaNumericOnly();

这将持续生成XUID,直到找到一个只包含代数字符的XUID。这意味着可能需要两次或更多次尝试才能返回有效的XUID。在实际应用中,这不会增加任何可感知的延迟。但在大量生成XUID时,这一点值得注意。

自定义字符映射

默认的XUID字符映射(URL安全)是

  • + => -
  • / => _

但是,您可以通过调用Xuid::map()为base64编码中使用的任何字符应用任何其他映射。例如,您可以通过映射+_到可选字符来创建双击安全的XUID(整个XUID可以通过双击简单选择),例如

Xuid::setMap(
    [
        '+' => 'Æ',
        '/' => 'Ä',
    ]
);

echo Xuid::getXuid() . PHP_EOL; // Outputs a XUID such as `xQamÆ0kGSjepUAD1bÄ09kg`

请注意,如果您的用例需要URL安全的XUID,请只传递URL安全的字符。

PHPUnit测试

vendor/bin/phpunit test/

由LinkORB工程团队提供


查看我们的其他项目:engineering.linkorb.com

顺便说一下,我们在招聘!