#random #entropy #rand

no-std nanorand

一个轻量、快速、零依赖的随机数生成库

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 算法

Download history 183999/week @ 2024-03-14 199529/week @ 2024-03-21 204731/week @ 2024-03-28 203684/week @ 2024-04-04 216747/week @ 2024-04-11 224022/week @ 2024-04-18 214392/week @ 2024-04-25 217947/week @ 2024-05-02 214267/week @ 2024-05-09 236913/week @ 2024-05-16 253343/week @ 2024-05-23 260804/week @ 2024-05-30 251182/week @ 2024-06-06 248749/week @ 2024-06-13 233179/week @ 2024-06-20 212404/week @ 2024-06-27

999,538 每月下载量
用于 208 个 crate (63 直接使用)

Zlib 许可证

50KB
875

crates.io docs.rs License: Zlib Tests Average time to resolve an issue Percentage of issues still open Maintenance

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 则是一切和厨房用具。
  • fastrandoorandomrandom-fast-rngrandomize - 这些都是 PCG 家族 RNG 的最小、零依赖实现(Pcg32 和 Pcg64)。虽然这些相当不错,但它们比 wyrand(在提供 64 个随机位的同时击败了这些 Pcg32 实现的速度)要慢得多,并且不提供 CSPRNG。
  • getrandom - getrandom crate 只提供 OS 熵源。它不是为了随机数生成而设计的。实际上,我们将其作为可选的熵源提供。

RNG 实现

RNG nanorand 类型 输出大小 密码学安全 速度1 说明 原始实现
wyrand nanorand::WyRandnanorand::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 的 BCryptGenRandomBCRYPT_USE_SYSTEM_PREFERRED_RNG)。
    • 否则,我们将使用 RtlGenRandom

特性标志

  • alloc(默认)- 启用 Rust alloc 库功能,例如缓冲 Rng 包装器。
  • std(默认)- 启用 Rust std 库功能,例如从操作系统熵源进行播种。需要启用 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]

此软件按“原样”提供,不提供任何明示或暗示的保证。在任何情况下,作者都不会因使用此软件而承担任何损害赔偿责任。

任何人都可以出于任何目的使用此软件,包括商业应用,并自由修改和重新分发,但须遵守以下限制

  1. 此软件的来源不得被误传;你不得声称你编写了原始软件。如果你将此软件用于产品中,产品文档中的认可将被赞赏,但不是必需的。

  2. 修改后的源代码版本必须清楚地标记为修改版本,并且不得将其误传为原始软件。

  3. 本通知不得从任何来源分发中移除或更改。

依赖项

~0–375KB