ChaCha8State

Struct ChaCha8State 

Source
pub struct ChaCha8State {
    pub seed: [u8; 32],
    pub bytes_consumed: u16,
}
Expand description

Snapshot of the state of a ChaCha8Rand instance.

Created with ChaCha8Rand::clone_state and used by ChaCha8Rand::try_restore_state. It simply records the seed of the current iteration of the generator and how many output bytes of that iteration have already been consumed. Restoring from it is effectively the same as calling rng.set_seed(&seed) and then throwing away bytes_consumed many bytes of output. However, going through ChaCha8Rand::try_restore_state can catch some possible mistakes because it validates that bytes_consumed is in the range it should be.

Possible use cases include:

  • Saving and restoring the RNG state as part of a game’s (auto-)save feature.
  • Suspending and later resume a long-running computation by saving the RNG (and all other state) to disk.
  • Forking a randomized algorithm, running it twice with the same randomness but handling different input, to see how they diverge (e.g., “what if” queries).

There are no serde impls. Instead, the fields are public so you can (de-)serialize them in any way you see fit. In this case you should be prepared to handle errors due to out-of-range bytes_consumed values gracefully.

Nothing stops you from constructing a ChaCha8State out of thin air (rather than cloning from an existing generator), but there’s probably no reason to do so. You can supply a new seed directly with ChaCha8Rand::new or ChaCha8Rand::set_seed.

Finally, note that ChaCha8Rand also implements Clone. Cloning a generator achieves the same effect as taking a snapshot of its state and restoring from it, but the generator is much larger because it includes a big buffer of output. If you want to duplicate a generator and consume output from both copies, cloning is easier and doesn’t have to re-compute the output that’s already buffered. But if you store several snapshots and possibly use some of them at a later time, cloning would waste a lot of memory.

§Examples

let state = rng.clone_state();
let first_output = rng.read_u64();
rng.try_restore_state(&state).expect("snapshot is valid because it was not modified");
assert_eq!(rng.read_u64(), first_output);

Fields§

§seed: [u8; 32]

The seed of the current ChaCha8Rand iteration.

§bytes_consumed: u16

How much output from the current ChaCha8Rand iteration was already consumed.

Trait Implementations§

Source§

impl Clone for ChaCha8State

Source§

fn clone(&self) -> ChaCha8State

Returns a duplicate 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 Debug for ChaCha8State

Source§

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

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

impl Copy for ChaCha8State

Auto Trait Implementations§

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, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
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.