可以通過以下地址學(xué)習(xí)composer:學(xué)習(xí)地址
在開發(fā)一個(gè)需要生成url安全的隨機(jī)令牌的項(xiàng)目時(shí),我遇到了一個(gè)棘手的問題:如何確保生成的令牌既安全又簡(jiǎn)潔,并且能夠在url中使用而不引起任何問題。經(jīng)過一番嘗試,我發(fā)現(xiàn)tuupola/base62庫能夠完美解決這個(gè)問題。
tuupola/base62是一個(gè)專門用于base62編碼和解碼的php庫。它不僅可以處理整數(shù),還可以對(duì)任意數(shù)據(jù)進(jìn)行編碼和解碼,這對(duì)于生成URL安全的隨機(jī)令牌非常有用。
首先,使用composer安裝這個(gè)庫非常簡(jiǎn)單:
composer require tuupola/base62
這個(gè)庫支持PHP 7.1及以上版本。如果你使用的是PHP 5.6或7.0,可以安裝舊版本:
composer require "tuupola/base62:^1.0"
在使用過程中,你可以選擇使用純PHP編碼器或基于GMP(gnu Multiple Precision Arithmetic Library)的編碼器。默認(rèn)情況下,如果系統(tǒng)安裝了GMP擴(kuò)展,庫會(huì)使用GMP函數(shù);否則會(huì)使用純PHP編碼器。
以下是一個(gè)簡(jiǎn)單的例子,展示如何使用tuupola/base62庫生成和解碼隨機(jī)令牌:
$base62 = new TuupolaBase62; $encoded = $base62->encode(random_bytes(128)); $decoded = $base62->decode($encoded);
如果你需要處理整數(shù),可以使用encodeInteger()和decodeInteger()方法:
$integer = $base62->encodeInteger(987654321); /* 14q60P */ print $base62->decodeInteger("14q60P"); /* 987654321 */
需要注意的是,編碼字符串和整數(shù)會(huì)產(chǎn)生不同的結(jié)果:
$string = $base62->encode("987654321"); /* KHc6iHtXW3iD */ $integer = $base62->encodeInteger(987654321); /* 14q60P */
tuupola/base62庫還支持自定義字符集。默認(rèn)使用GMP風(fēng)格的字符集,但你也可以選擇反轉(zhuǎn)字符集或其他任何包含62個(gè)唯一字符的自定義字符集:
use TuupolaBase62; 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 */
性能方面,如果系統(tǒng)支持GMP擴(kuò)展,使用GMP編碼器會(huì)比純PHP編碼器快得多。以下是編碼128字節(jié)隨機(jī)數(shù)據(jù)的基準(zhǔn)測(cè)試結(jié)果:
$ 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 | +-----------------------+------------------+-----------+
如果你更喜歡使用靜態(tài)語法,可以使用提供的靜態(tài)代理:
use TuupolaBase62Proxy as Base62; $encoded = Base62::encode(random_bytes(128)); $decoded = Base62::decode($encoded); $encoded2 = Base62::encodeInteger(987654321); $decoded2 = Base62::decodeInteger($encoded2);
總的來說,tuupola/base62庫通過其高效的base62編碼和解碼功能,解決了我在項(xiàng)目中遇到的URL安全隨機(jī)令牌生成問題。它不僅操作簡(jiǎn)單,而且性能優(yōu)異,非常適合需要在URL中使用安全且簡(jiǎn)潔的令牌的場(chǎng)景。