16 个不稳定版本 (7 个破坏性更新)
0.7.0 | 2022年3月9日 |
---|---|
0.6.1 | 2021年7月24日 |
0.5.2 | 2020年12月30日 |
0.4.4 | 2020年9月23日 |
0.0.0 | 2020年9月6日 |
#69 in 算法
999,538 每月下载量
用于 208 个 crate (63 直接使用)
50KB
875 行
nanorand
当前版本: 0.7.0
一个旨在实现快速随机数生成、快速编译时间和最小依赖的库。
示例
使用初始化的 RNG 生成数字
use nanorand::{Rng, WyRand};
let mut rng = WyRand::new();
println!("Random number: {}", rng.generate::<u64>());
使用线程局部 RNG 生成数字
use nanorand::Rng;
let mut rng = nanorand::tls_rng();
println!("Random number: {}", rng.generate::<u64>());
在范围内生成数字
use nanorand::{Rng, WyRand};
let mut rng = WyRand::new();
println!("Random number between 1 and 100: {}", rng.generate_range(1_u64..=100));
println!("Random number between -100 and 50: {}", rng.generate_range(-100_i64..=50));
缓冲随机字节
use nanorand::{Rng, BufferedRng, WyRand};
let mut thingy = [0u8; 5];
let mut rng = BufferedRng::new(WyRand::new());
rng.fill(&mut thingy);
// As WyRand generates 8 bytes of output, and our target is only 5 bytes,
// 3 bytes will remain in the buffer.
assert_eq!(rng.buffered(), 3);
打乱 Vec
use nanorand::{Rng, WyRand};
let mut rng = WyRand::new();
let mut items = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
rng.shuffle(&mut items);
为什么我应该使用这个而不是...
rand
- 标准的 rand crate 是一个复杂的野兽。它在核心实现中包含不安全代码,虽然它比我们提供的选项要多得多,但这正是重点。我们直截了当,而 rand 则是一切和厨房用具。fastrand
、oorandom
、random-fast-rng
或randomize
- 这些都是 PCG 家族 RNG 的最小、零依赖实现(Pcg32 和 Pcg64)。虽然这些相当不错,但它们比 wyrand(在提供 64 个随机位的同时击败了这些 Pcg32 实现的速度)要慢得多,并且不提供 CSPRNG。getrandom
- getrandom crate 只提供 OS 熵源。它不是为了随机数生成而设计的。实际上,我们将其作为可选的熵源提供。
RNG 实现
RNG | nanorand 类型 | 输出大小 | 密码学安全 | 速度1 | 说明 | 原始实现 |
---|---|---|---|---|---|---|
wyrand | nanorand::WyRand ,nanorand::tls::TlsWyRand |
64 位 (u64 ) |
🚫 | 16.4 GB/s | https://github.com/lemire/testingRNG/blob/master/source/wyrand.h | |
Pcg64 | nanorand::Pcg64 |
64 位 (u64 ) |
🚫 | 1.6 GB/s | https://github.com/rkern/pcg64 | |
ChaCha | nanorand::ChaCha |
512 位 ([u32; 16] ) |
Γ£à | 204 MB/s(ChaCha8),79 MB/s(ChaCha20) | 仅在 Rust 1.47 或更高版本中工作 | https://cr.yp.to/chacha.html |
1. 在 M1 MacBook Air 上进行速度基准测试
熵源
按优先级列出
- 如果启用了
getrandom
功能,则将调用getrandom::getrandom
。 - 如果启用了
rdseed
功能,并且正在 x86(-64) 系统上运行具有 RDSEED 指令,那么我们将通过我们的rdseed_entropy
函数尝试尽可能多地获取熵。 - Linux 和 Android 将尝试使用
getrandom
系统调用。 - macOS 和 iOS(基于 Darwin 的系统)将使用 Security.framework 的
SecRandomCopyBytes
。 - Windows
- 如果我们针对 UWP,则使用带有系统首选 RNG 的
BCryptGenRandom
(BCRYPT_USE_SYSTEM_PREFERRED_RNG
)。 - 否则,我们将使用
RtlGenRandom
。
- 如果我们针对 UWP,则使用带有系统首选 RNG 的
特性标志
alloc
(默认)- 启用 Rustalloc
库功能,例如缓冲 Rng 包装器。std
(默认)- 启用 Ruststd
库功能,例如从操作系统熵源进行播种。需要启用alloc
。tls
(默认)- 启用一个线程局部WyRand
RNG(见下文)。需要启用std
。wyrand
(默认)- 启用WyRand
RNG。pcg64
(默认)- 启用Pcg64
RNG。chacha
- 启用ChaCha
RNG。需要 Rust 1.47 或更高版本。rdseed
- 在 x86 和 x86-64 平台上,当操作系统熵不可用时会使用rdseed
内置函数。zeroize
- 为所有 RNG 实现零化 trait。getrandom
- 使用getrandom
crate 作为熵源。在大多数系统上工作,由于引入了更多依赖项,因此是可选的。
许可证
zlib/libpng 许可证
版权所有(c)2022 Lucy [email protected]
此软件按“原样”提供,不提供任何明示或暗示的保证。在任何情况下,作者都不会因使用此软件而承担任何损害赔偿责任。
任何人都可以出于任何目的使用此软件,包括商业应用,并自由修改和重新分发,但须遵守以下限制
-
此软件的来源不得被误传;你不得声称你编写了原始软件。如果你将此软件用于产品中,产品文档中的认可将被赞赏,但不是必需的。
-
修改后的源代码版本必须清楚地标记为修改版本,并且不得将其误传为原始软件。
-
本通知不得从任何来源分发中移除或更改。
依赖项
~0–375KB