rand_jitter
基于定时抖动的非物理真随机数发生器。
这是一个真正的随机数生成器,而不是伪随机数生成器。由JitterRng生成的随机数可以看作是新的熵。其结果是,它比OsRng和PRNGs慢了一个数量级(大约103个数量级)。106慢)。
很少有情况下使用RNG是合适的。只有很少的应用需要真正的熵。正常的PRNG可能在统计上难以区分,而加密的PRNG也应该同样无法预测。
JitterRng可以在没有标准库的情况下使用,但是不方便,您必须提供一个高精度的计时器,并且必须严格遵循JitterRng::new_with_timer的说明。
cargo add rand_jitter
pub fn set_rounds(&mut self, rounds: u8)
配置用于生成每个64位值的轮数。这必须大于零,并且对性能和输出质量有很大的影响。
new_with_timer保守地使用64轮,但通常可以使用更少的轮。test_timer()函数返回全强度(平台相关)所需的最小轮数,因此可以使用rng.set_rounds(rng.test_timer()?);或缓存该值。
pub fn test_timer(&mut self) -> Result<u8, TimerError>
基本的定时器质量测试,通过测量CPU定时抖动几百次。
如果成功,这将返回收集64位熵所需的估计回合数。否则将返回一个带有失败原因的TimerError。
−]
pub enum Result<T, E> {
Ok(T),
Err(E),
}
Ok(T)
Contains the success value
Err(E)
Contains the error value
Result is a type that represents either success (Ok) or failure (Err).
See the std::result module documentation for details.
Compiling learn47 v0.1.0 (F:\learn\rustlearn\learn47)
Finished dev [unoptimized + debuginfo] target(s) in 0.76s
Running `F:\learn\rustlearn\learn47\target\debug\learn47.exe`
5410982393200311058
11079485389792716384
14298778480130199918
------------------
(program exited with code: 0)
请按任意键继续. . .
extern crate rand_jitter;
use rand_jitter::JitterRng;
use crate::rand_jitter::rand_core::RngCore;
fn get_nstime() -> u64 {
use std::time::{SystemTime, UNIX_EPOCH};
let dur = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
// The correct way to calculate the current time is
// `dur.as_secs() * 1_000_000_000 + dur.subsec_nanos() as u64`
// But this is faster, and the difference in terms of entropy is
// negligible (log2(10^9) == 29.9).
dur.as_secs() << 30 | dur.subsec_nanos() as u64
}
fn main() {
let mut rng = JitterRng::new_with_timer(get_nstime);
let _ = rng.next_u64();
// Ready for use
let v1: u64 = rng.next_u64();
println!("{:?}", v1);
let v2: u64 = rng.next_u64();
println!("{:?}", v2);
let v3: u64 = rng.next_u64();
println!("{:?}", v3);
}