tuupola / base58
任意数据的 Base58 编码和解码器
Requires
- php: ^7.1|^8.0
Requires (Dev)
- overtrue/phplint: ^1.0.0
- phpbench/phpbench: ^0.13.0
- phpstan/phpstan: ^0.12.37
- 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
这个库实现了 Base58 编码。除了整数外,它还可以对任意数据进行编码和解码。也就是说,Base58 很适合解码大整数,但并不是为了解码长段二进制数据而设计的。
安装
使用 composer 安装。
$ composer require tuupola/base58
这个分支需要 PHP 7.1 或更高版本。较旧的 1.x 分支也支持 PHP 5.6 和 7.0。
$ composer require "tuupola/base58:^1.0"
用法
此包同时提供纯 PHP 和基于 GMP 的编码器。默认情况下,如果安装了扩展,编码器和解码器将使用 GMP 函数。如果没有 GMP,则将使用纯 PHP 编码器。
$base58 = new Tuupola\Base58; $encoded = $base58->encode(random_bytes(128)); $decoded = $base58->decode($encoded);
如果您正在对整数进行编码和解码,请使用隐式的 decodeInteger() 和 encodeInteger() 方法。
$integer = $base58->encodeInteger(987654321); /* 1TFvCj */ print $base58->decodeInteger("1TFvCj", true); /* 987654321 */
请注意,对字符串和整数进行编码将产生不同的结果。
$string = $base58->encode("987654321"); /* gE62MGeOBMPt */ $integer = $base58->encodeInteger(987654321); /* 1TFvCj */
字符集
默认情况下,Base58 使用 GMP 风格的字符集。提供了 Bitcoin、Flickr、Ripple 和 IPFS 字符集的快捷方式。您也可以使用任何自定义的 58 个字符。
use Tuupola\Base58; print Base58::GMP /* 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv */ print Base58::BITCOIN /* 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz */ print Base58::FLICKR /* 123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ */ print Base58::RIPPLE /* rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz */ print Base58::IPFS /* 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz */ $default = new Base58(["characters" => Base58::GMP]); $bitcoin = new Base58(["characters" => Base58::BITCOIN]); print $default->encode("Hello world!"); /* 1LDlk6QWOejX6rPrJ */ print $bitcoin->encode("Hello world!"); /* 2NEpo7TZRhna7vSvL */
Base58Check 支持
此库支持比特币地址中使用的 Base58Check 编码。解码将验证版本和校验和。如果其中任何一个失败,将抛出 RuntimeException
。
use Tuupola\Base58; $base58check = new Base58([ "characters" => Base58::BITCOIN, "check" => true, "version" => 0x00 ]); print $base58check->encode("Hello world!"); /* 19wWTEnNTWna86WmtFsTAr5 */ try { $base58check->decode("19wWTEnNTWna86WmtFsTArX"); } catch (RuntimeException $exception) { /* Checksum "84fec52c" does not match the expected "84fec512" */ print $exception->getMessage(); }
速度
如果可能,请安装 GMP。它是比纯 PHP 编码器快得多的编码器。以下基准测试是对 random_bytes(128)
数据进行编码。BCMatch 编码器也包括在内,但它主要只是作为一个好奇心。它太慢,无法使用。
$ vendor/bin/phpbench run benchmarks/ --report=default
+-----------------------+------------------+--------------+
| subject | mean | diff |
+-----------------------+------------------+--------------+
| benchGmpEncoder | 101,832.994ops/s | 0.00% |
| benchGmpEncoderCustom | 97,656.250ops/s | +4.28% |
| benchPhpEncoder | 305.913ops/s | +33,188.19% |
| benchBcmathEncoder | 32.457ops/s | +313,643.79% |
+-----------------------+------------------+--------------+
静态代理
如果您更喜欢使用静态语法,请使用提供的静态代理。
use Tuupola\Base58Proxy as Base58; $encoded = Base58::encode(random_bytes(128)); $decoded = Base58::decode($encoded);
测试
您可以手动运行测试,或者在每个代码更改时自动运行。自动测试需要 entr 工作。
$ make test
$ brew install entr $ make watch
贡献
有关详细信息,请参阅 CONTRIBUTING。
安全性
如果您发现任何与安全性相关的问题,请通过电子邮件 tuupola@appelsiini.net 而不是使用问题跟踪器。
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。