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"