mirror of
https://github.com/opnsense/src.git
synced 2026-04-25 08:07:28 -04:00
Add prng(9) as a replacement for random(9) in the kernel.
There are two major differences from random(9) and random(3):
- General prng(9) APIs (prng32(9), etc) do not guarantee an
implementation or particular sequence; they should not be used for
repeatable simulations.
- However, specific named API families are also exposed (for now: PCG),
and those are expected to be repeatable (when so-guaranteed by the named
algorithm).
Some minor differences from random(3) and earlier random(9):
- PRNG state for the general prng(9) APIs is per-CPU; this eliminates
contention on PRNG state in SMP workloads. Each PCPU generator in an
SMP system produces a unique sequence.
- Better statistical properties than the Park-Miller ("minstd") PRNG
(longer period, uniform distribution in all bits, passes
BigCrush/PractRand analysis).
- Faster than Park-Miller ("minstd") PRNG -- no division is required to
step PCG-family PRNGs.
For now, random(9) becomes a thin shim around prng32(). Eventually I
would like to mechanically switch consumers over to the explicit API.
Reviewed by: kib, markj (previous version both)
Discussed with: markm
Differential Revision: https://reviews.freebsd.org/D25916
20 lines
354 B
C
20 lines
354 B
C
/*-
|
|
* This file is in the public domain.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef _SYS_PRNG_H_
|
|
#define _SYS_PRNG_H_
|
|
|
|
#define PCG_USE_INLINE_ASM 1
|
|
#include <contrib/pcg-c/include/pcg_variants.h>
|
|
|
|
#ifdef _KERNEL
|
|
__uint32_t prng32(void);
|
|
__uint32_t prng32_bounded(__uint32_t bound);
|
|
__uint64_t prng64(void);
|
|
__uint64_t prng64_bounded(__uint64_t bound);
|
|
#endif
|
|
|
|
#endif
|