tuupola / base62
任意数据的Base62编码和解码器
2.1.0
2020-09-09 15:05 UTC
Requires
- php: ^7.1|^8.0
Requires (Dev)
- overtrue/phplint: ^1.0
- phpbench/phpbench: ^0.15.0
- phpstan/phpstan: ^0.12.38
- phpunit/phpunit: ^7.0|^8.0|^9.0
- squizlabs/php_codesniffer: ^3.0
Suggests
- ext-gmp: GMP extension provides the fastest encoding and decoding.
README
这个库实现了Base62编码。除了整数,它还可以对任何任意数据进行编码和解码。例如,当生成数据库标识符的URL安全随机令牌时非常有用。
安装
使用 composer 安装。
$ composer require tuupola/base62
此分支需要PHP 7.1或更高版本。较老的 1.x
分支也支持PHP 5.6和7.0。
$ composer require "tuupola/base62:^1.0"
用法
此包同时提供了纯PHP和基于 GMP 的编码器。默认情况下,如果安装了扩展,编码器和解码器将使用GMP函数。如果GMP不可用,则将使用纯PHP编码器。
$base62 = new Tuupola\Base62; $encoded = $base62->encode(random_bytes(128)); $decoded = $base62->decode($encoded);
如果您正在对整数进行编码和解码,请使用隐式的 decodeInteger()
和 encodeInteger()
方法。
$integer = $base62->encodeInteger(987654321); /* 14q60P */ print $base62->decodeInteger("14q60P"); /* 987654321 */
请注意,编码字符串和整数将产生不同的结果。
$string = $base62->encode("987654321"); /* KHc6iHtXW3iD */ $integer = $base62->encodeInteger(987654321); /* 14q60P */
字符集
默认情况下,Base62使用GMP风格的字符集。提供了对常用反转字符集的快捷访问。您还可以使用任何包含62个唯一字符的自定义字符集。
use Tuupola\Base62; print Base62::GMP; /* 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz */ print Base62::INVERTED; /* 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ */ $default = new Base62(["characters" => Base62::GMP]); $inverted = new Base62(["characters" => Base62::INVERTED]); print $default->encode("Hello world!"); /* T8dgcjRGuYUueWht */ print $inverted->encode("Hello world!"); /* t8DGCJrgUyuUEwHT */
速度
如果可能,请安装GMP。它是比纯PHP编码器快得多的编码器。以下基准测试是对 random_bytes(128)
数据进行编码的。还包含了BCMatch编码器,但它主要只是作为一个好奇心。它太慢了,无法使用。
$ php --version
PHP 8.0.7 (cli) (built: Jun 4 2021 03:50:01) ( NTS )
$ make bench
+-----------------------+------------------+-----------+
| subject | mean | diff |
+-----------------------+------------------+-----------+
| benchGmpDecoder | 140,409.997ops/s | 1.10x |
| benchGmpDecoderCustom | 154,607.297ops/s | 1.00x |
| benchPhpDecoder | 721.147ops/s | 214.39x |
| benchBcmathDecoder | 72.191ops/s | 2,141.64x |
+-----------------------+------------------+-----------+
+-----------------------+------------------+-----------+
| subject | mean | diff |
+-----------------------+------------------+-----------+
| benchGmpEncoder | 352,609.309ops/s | 1.00x |
| benchGmpEncoderCustom | 350,140.056ops/s | 1.01x |
| benchPhpEncoder | 669.959ops/s | 526.31x |
| benchBcmathEncoder | 72.956ops/s | 4,833.21x |
+-----------------------+------------------+-----------+
静态代理
如果您更喜欢使用静态语法,请使用提供的静态代理。
use Tuupola\Base62Proxy as Base62; $encoded = Base62::encode(random_bytes(128)); $decoded = Base62::decode($encoded); $encoded2 = Base62::encodeInteger(987654321); $decoded2 = Base62::decodeInteger($encoded2);
测试
您可以手动或自动地在每次代码更改时运行测试。自动测试需要 entr 的工作。
$ make test
$ brew install entr $ make watch
贡献
有关详细信息,请参阅 CONTRIBUTING。
安全性
如果您发现任何与安全相关的问题,请通过电子邮件 tuupola@appelsiini.net 而不是使用问题跟踪器来联系。
许可证
MIT许可证(MIT)。有关更多信息,请参阅 许可证文件。