编程

PHP 8.3 提前预览:Random 扩展 - 新增 \Random\Randomizer::getBytesFromString 方法

1301 2023-04-18 03:04:00

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"