蝴蝶团队 / avalanche-cb58
任意数据的Base58编码和解码器
1.2
2021-03-06 14:38 UTC
Requires
- php: ^7.1|^8.0
Requires (Dev)
- overtrue/phplint: ^1.0.0
- phpbench/phpbench: ^0.13.0|1.0.0-alpha3
- 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 "butterfly-team/avalanche-cb58:^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)。有关更多信息,请参阅许可证文件。