PHP 8.3 提前预览:Random 扩展 - 新增 \Random\Randomizer::getBytesFromString 方法
PHP 8.3 中 \Random\Randomize
类将支持一个新的方法叫 getBytesFromString
,该函数将返回一个指定长度(由$length
参数指定)随机数序列,它仅包含所请求的字节序列中的一个字节($string
参数)。
请注意,Random\Randomizer::getBytesFromString()
方法在字节级别上运行。它不能打乱多字节字符,如 Emojis、汉字字符等。
\Random\Randomizer::getBytesFromString()
方法摘要
namespace Random;
class Randomizer {
// ...
/**
* @param string $string String of bytes/characters that will be used to return random bytes
* @param int $length Number of bytes in the return value.
* @return string
*
* @throws \ValueError if $string is empty
* @throws \ValueError if the $length is <= 0
* @throws \Random\BrokenRandomEngineError if the engine failed to generate random byte sequence in requested length.
*/
public function getBytesFromString(string $string, int $length): string {
}
}
$string
参数中允许有重复的字符。多次出现会增加特定字符出现在返回的随机化值中的概率。- 如果
$string
参数为空,则抛出\ValueError
异常 - 如果
$string≤0
,则抛出\ValueError
异常 - 如果底层引擎不能在请求的长度中生成随机字节序列,则抛出
\Random\BrokenRandomEngineError
异常
用例
生成一个包含 5 个字符的字符串,使用 Douglas Crockford base32 字符集
$rng = new Random\Randomizer();
$crockfordAlphabet = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
$rng->getBytesFromString($crockfordAlphabet, 5); // "5YH8T"
$rng->getBytesFromString($crockfordAlphabet, 5); // "XBZ9P"
$rng->getBytesFromString($crockfordAlphabet, 5); // "3TF6Y"
$rng->getBytesFromString($crockfordAlphabet, 5); // "MZD6N"
生成一个只包含 AEIOU 的字符
$rng = new Random\Randomizer();
$chars = 'AEIOU';
$rng->getBytesFromString($chars, 1); // "E"
$rng->getBytesFromString($chars, 5); // "AIIEO"
$rng->getBytesFromString($chars, 10); // "IEAUAIIOUE"
生成一个概率倾斜的随机字符串:
$rng = new Random\Randomizer();
$chars = 'AAAAAABBC';
$rng->getBytesFromString($chars, 1); // "A"
$rng->getBytesFromString($chars, 5); // "ACBAC"
$rng->getBytesFromString($chars, 10); // "ACAABAAABAAAAAC"