rand_core::block

Struct BlockRng

source
pub struct BlockRng<R: BlockRngCore + ?Sized> {
    pub core: R,
    /* private fields */
}
Expand description

A wrapper type implementing RngCore for some type implementing BlockRngCore with u32 array buffer; i.e. this can be used to implement a full RNG from just a generate function.

The core field may be accessed directly but the results buffer may not. PRNG implementations can simply use a type alias (pub type MyRng = BlockRng<MyRngCore>;) but might prefer to use a wrapper type (pub struct MyRng(BlockRng<MyRngCore>);); the latter must re-implement RngCore but hides the implementation details and allows extra functionality to be defined on the RNG (e.g. impl MyRng { fn set_stream(...){...} }).

BlockRng has heavily optimized implementations of the RngCore methods reading values from the results buffer, as well as calling BlockRngCore::generate directly on the output array when fill_bytes / try_fill_bytes is called on a large array. These methods also handle the bookkeeping of when to generate a new batch of values.

No whole generated u32 values are thrown away and all values are consumed in-order. next_u32 simply takes the next available u32 value. next_u64 is implemented by combining two u32 values, least significant first. fill_bytes and try_fill_bytes consume a whole number of u32 values, converting each u32 to a byte slice in little-endian order. If the requested byte length is not a multiple of 4, some bytes will be discarded.

See also BlockRng64 which uses u64 array buffers. Currently there is no direct support for other buffer types.

For easy initialization BlockRng also implements SeedableRng.

Fields§

§core: R

The core part of the RNG, implementing the generate function.

Implementations§

source§

impl<R: BlockRngCore> BlockRng<R>

source

pub fn new(core: R) -> BlockRng<R>

Create a new BlockRng from an existing RNG implementing BlockRngCore. Results will be generated on first use.

source

pub fn index(&self) -> usize

Get the index into the result buffer.

If this is equal to or larger than the size of the result buffer then the buffer is “empty” and generate() must be called to produce new results.

source

pub fn reset(&mut self)

Reset the number of available results. This will force a new set of results to be generated on next use.

source

pub fn generate_and_set(&mut self, index: usize)

Generate a new set of results immediately, setting the index to the given value.

Trait Implementations§

source§

impl<R: Clone + BlockRngCore + ?Sized> Clone for BlockRng<R>
where R::Results: Clone,

source§

fn clone(&self) -> BlockRng<R>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<R: BlockRngCore + Debug> Debug for BlockRng<R>

source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<R: BlockRngCore<Item = u32>> RngCore for BlockRng<R>
where <R as BlockRngCore>::Results: AsRef<[u32]> + AsMut<[u32]>,

source§

fn next_u32(&mut self) -> u32

Return the next random u32. Read more
source§

fn next_u64(&mut self) -> u64

Return the next random u64. Read more
source§

fn fill_bytes(&mut self, dest: &mut [u8])

Fill dest with random data. Read more
source§

fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error>

Fill dest entirely with random data. Read more
source§

impl<R: BlockRngCore + SeedableRng> SeedableRng for BlockRng<R>

source§

type Seed = <R as SeedableRng>::Seed

Seed type, which is restricted to types mutably-dereferenceable as u8 arrays (we recommend [u8; N] for some N). Read more
source§

fn from_seed(seed: Self::Seed) -> Self

Create a new PRNG using the given seed. Read more
source§

fn seed_from_u64(seed: u64) -> Self

Create a new PRNG using a u64 seed. Read more
source§

fn from_rng<S: RngCore>(rng: S) -> Result<Self, Error>

Create a new PRNG seeded from another Rng. Read more
source§

fn from_entropy() -> Self

Creates a new instance of the RNG seeded via getrandom. Read more
source§

impl<R: BlockRngCore + CryptoRng> CryptoRng for BlockRng<R>

Auto Trait Implementations§

§

impl<R> Freeze for BlockRng<R>
where <R as BlockRngCore>::Results: Freeze, R: Freeze + ?Sized,

§

impl<R> RefUnwindSafe for BlockRng<R>

§

impl<R> Send for BlockRng<R>
where <R as BlockRngCore>::Results: Send, R: Send + ?Sized,

§

impl<R> Sync for BlockRng<R>
where <R as BlockRngCore>::Results: Sync, R: Sync + ?Sized,

§

impl<R> Unpin for BlockRng<R>
where <R as BlockRngCore>::Results: Unpin, R: Unpin + ?Sized,

§

impl<R> UnwindSafe for BlockRng<R>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CryptoRngCore for T
where T: CryptoRng + RngCore,

source§

fn as_rngcore(&mut self) -> &mut dyn RngCore

Upcast to an RngCore trait object.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.