tuupola/base62

任意数据的Base62编码和解码器

2.1.0 2020-09-09 15:05 UTC

This package is auto-updated.

Last update: 2024-09-18 18:42:20 UTC


README

这个库实现了Base62编码。除了整数,它还可以对任何任意数据进行编码和解码。例如,当生成数据库标识符的URL安全随机令牌时非常有用。

Latest Version Packagist Software License Build Status Coverage

安装

使用 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)。有关更多信息,请参阅 许可证文件