rng_buffer

Crates.iorng_buffer
lib.rsrng_buffer
version0.1.1
sourcesrc
created_at2024-01-27 20:34:04.970945
updated_at2024-01-27 22:15:08.527488
descriptionWrappers around RNGs to buffer their output and save system calls
homepage
repositoryhttps://github.com/Pr0methean/rng_buffer
max_upload_size
id1116964
size47,182
Chris Hennick (Pr0methean)

documentation

https://docs.rs/rng_buffer/latest/rng_buffer/

README

rng_buffer

This small crate provides RngBufferCore, a struct that wraps any rand::Rng and implements BlockRngCore so that, when used in a rand_core::block::BlockRng64, it will fetch more bytes with each call. This is mainly intended to reduce the number of system calls when using rand::rngs::OsRng or a client of a remote RNG, for purposes where you want to reseed regularly to prevent subtle patterns in your random numbers, but don't need fast key erasure (mainly for Monte Carlo simulations and game servers; I don't recommend it for cryptography or gambling). Profiling with Vtune on an EC2 c7i.metal-24xl instance running Linux HVM kernel version 6.1.72-96.166.amzn2023.x86_64 showed that this reduced the number of CPU cycles spent inside system calls by 80% with a 256-byte buffer per thread (currently the default).

The following are also provided:

  • RngBufferWrapper, a wrapper around RngBufferCore that lets you share the buffer with all of its clones. It also bypasses the buffer and directly invokes the wrapped RNG when fill_bytes or try_fill_bytes is called with a slice that's as large as the buffer.
  • RngWrapper, a struct that wraps any Rng in an Rc<RefCell<_>> so that clones will use the same instance. Useful for implementing custom replacements for rand::rngs::ThreadRng.
  • thread_rng(), a drop-in replacement for rand::thread_rng() that uses an RngBufferCore per thread but otherwise behaves identically.
  • thread_seed_source(), which provides an RngBufferWrapper around a thread-local instance of OsRng.
  • build_default_seeder() and build_default_rng(), intended for no_std environments where you can't use thread-locals.
Commit count: 0

cargo fmt