Struct rand::rngs::adapter::ReseedingRng[][src]

pub struct ReseedingRng<R, Rsdr>(_)
where
    R: BlockRngCore + SeedableRng,
    Rsdr: RngCore
;

A wrapper around any PRNG which reseeds the underlying PRNG after it has generated a certain number of random bytes.

When the RNG gets cloned, the clone is reseeded on first use.

Reseeding is never strictly necessary. Cryptographic PRNGs don’t have a limited number of bytes they can output, or at least not a limit reachable in any practical way. There is no such thing as ‘running out of entropy’.

Some small non-cryptographic PRNGs can have very small periods, for example less than 264. Would reseeding help to ensure that you do not wrap around at the end of the period? A period of 264 still takes several centuries of CPU-years on current hardware. Reseeding will actually make things worse, because the reseeded PRNG will just continue somewhere else in the same period, with a high chance of overlapping with previously used parts of it.

When should you use ReseedingRng?

Error handling

Although extremely unlikely, reseeding the wrapped PRNG can fail. ReseedingRng will never panic but try to handle the error intelligently through some combination of retrying and delaying reseeding until later. If handling the source error fails ReseedingRng will continue generating data from the wrapped PRNG without reseeding.

Implementations

impl<R, Rsdr> ReseedingRng<R, Rsdr> where
    R: BlockRngCore + SeedableRng,
    Rsdr: RngCore
[src]

pub fn new(rng: R, threshold: u64, reseeder: Rsdr) -> Self[src]

Create a new ReseedingRng with the given parameters.

Arguments

  • rng: the random number generator to use.
  • threshold: the number of generated bytes after which to reseed the RNG.
  • reseeder: the RNG to use for reseeding.

pub fn reseed(&mut self) -> Result<(), Error>[src]

Reseed the internal PRNG.

Trait Implementations

impl<R, Rsdr> Clone for ReseedingRng<R, Rsdr> where
    R: BlockRngCore + SeedableRng + Clone,
    Rsdr: RngCore + Clone
[src]

impl<R, Rsdr> CryptoRng for ReseedingRng<R, Rsdr> where
    R: BlockRngCore + SeedableRng + CryptoRng,
    Rsdr: RngCore + CryptoRng
[src]

impl<R: Debug, Rsdr: Debug> Debug for ReseedingRng<R, Rsdr> where
    R: BlockRngCore + SeedableRng,
    Rsdr: RngCore
[src]

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

Auto Trait Implementations

impl<R, Rsdr> RefUnwindSafe for ReseedingRng<R, Rsdr> where
    R: RefUnwindSafe,
    Rsdr: RefUnwindSafe,
    <R as BlockRngCore>::Results: RefUnwindSafe

impl<R, Rsdr> Send for ReseedingRng<R, Rsdr> where
    R: Send,
    Rsdr: Send,
    <R as BlockRngCore>::Results: Send

impl<R, Rsdr> Sync for ReseedingRng<R, Rsdr> where
    R: Sync,
    Rsdr: Sync,
    <R as BlockRngCore>::Results: Sync

impl<R, Rsdr> Unpin for ReseedingRng<R, Rsdr> where
    R: Unpin,
    Rsdr: Unpin,
    <R as BlockRngCore>::Results: Unpin

impl<R, Rsdr> UnwindSafe for ReseedingRng<R, Rsdr> where
    R: UnwindSafe,
    Rsdr: UnwindSafe,
    <R as BlockRngCore>::Results: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<R> Rng for R where
    R: RngCore + ?Sized
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.