Statement on glibc/iconv Vulnerability

Random\Engine::generate

(PHP 8 >= 8.2.0)

Random\Engine::generateСоздаёт случайную последовательность

Описание

public Random\Engine::generate(): string

Возвращает случайную последовательность и передвигает состояние алгоритма на один шаг.

Случайная последовательность представлена двоичной строкой, содержащей случайные байты. Такое представление позволяет однозначно интерпретировать случайные биты, генерируемые алгоритмом, например, для адаптации различных размеров вывода, используемых различными алгоритмами.

Алгоритмы, которые изначально оперируют целыми значениями, должны возвращать целое число в порядке little-endian байтов, например, используя функцию pack() с кодом формата P. Высокоуровневый интерфейс, предоставляемый классом Random\Randomizer, будет интерпретировать возвращаемые случайные байты как целые числа без знака с малым порядком возрастания, если требуется числовое представление.

Настоятельно рекомендуется, чтобы каждый бит возвращаемой строки был выбран равномерно и независимо, поскольку некоторые приложения требуют для корректной работы случайности на уровне битов. Например, линейные конгруэнтные генераторы часто генерируют менее качественную случайную последовательность для младших битов возвращаемого целого значения и поэтому не подходят для приложений, требующих случайной последовательности на уровне битов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Engine::generate()

<?php
/**
* Реализует линейный конгруэнтный генератор с модулем 65536,
* множителем 61 и инкрементом 17, возвращающий 8-битное целое число.
*
* Примечание: Движок предназначен только для демонстрационных целей.
* Линейные конгруэнтные генераторы обычно генерируют случайность низкого
* качества, а данная конкретная реализация имеет
* очень короткий 16-битный период, который не подходит практически
* ни для одного реального случая использования.
*/
final class LinearCongruentialGenerator implements \Random\Engine
{
private
int $state;

public function
__construct(?int $seed = null)
{
if (
$seed === null) {
$seed = random_int(0, 0xffff);
}

$this->state = $seed & 0xffff;
}

public function
generate(): string
{
$this->state = (61 * $this->state + 17) & 0xffff;

return
pack('C', $this->state >> 8);
}
}

$r = new \Random\Randomizer(
new
LinearCongruentialGenerator(seed: 1)
);

echo
"Счастливое число: ", $r->getInt(0, 99), "\n";
?>

Результат выполнения приведённого примера:

Счастливое число: 4
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top