首页 > 其他分享 >短小精悍(4) - Rust操作系统随机数getrandom库介绍

短小精悍(4) - Rust操作系统随机数getrandom库介绍

时间:2023-12-28 09:56:51浏览次数:37  
标签:mut uuid getrandom rng feature 随机数 短小精悍 Rust

今天带来的是另一个“短小精悍”的库:getrandom。它的作用是从操作系统提供的随机数源获得一段随机数。

用法

getrandom的用法很简单,唯一需要了解的就是它内部的同名函数:

pub fn getrandom(dest: &mut [u8]) -> Result<(), Error>

它将会向dest中填充来自操作系统的随机数。

示例:

fn main() {
    let mut data = [0u8; 8];
    getrandom::getrandom(&mut data).unwrap();
    println!("{:?}", data);
}

// $ ./playground
// [186, 180, 148, 20, 13, 30, 186, 46]

用途

首先,读者应当了解一点:getrandom在性能上并不如rand库的thread_rng,它并不适合被放置在热点路径上反复调用。getrandom应当被用来生成那种“一次性使用”的随机数,例如在其他随机数算法中使用的种子。

例如,在默认的feature flags下,著名的加密库ahash便使用getrandom库来为Hasher在运行时提供种子:

// aHash/src/random_state.rs:73
if #[cfg(all(feature = "runtime-rng", not(fuzzing)))] {
    #[inline]
    fn get_fixed_seeds() -> &'static [[u64; 4]; 2] {
        use crate::convert::Convert;

        static SEEDS: OnceBox<[[u64; 4]; 2]> = OnceBox::new();

        SEEDS.get_or_init(|| {
            let mut result: [u8; 64] = [0; 64];
            getrandom::getrandom(&mut result).expect("getrandom::getrandom() failed.");
            Box::new(result.convert())
        })
    }
}

uuidgetrandom库的态度也能佐证这一点:

// uuid/src/rng.rs:1
#[cfg(any(feature = "v4", feature = "v7"))]
pub(crate) fn bytes() -> [u8; 16] {
    #[cfg(not(feature = "fast-rng"))]
    {
        let mut bytes = [0u8; 16];

        getrandom::getrandom(&mut bytes).unwrap_or_else(|err| {
            // NB: getrandom::Error has no source; this is adequate display
            panic!("could not retrieve random bytes for uuid: {}", err)
        });

        bytes
    }

    #[cfg(feature = "fast-rng")]
    {
        rand::random()
    }
}

uuid默认开启的特性fast-rng下,uuid将会使用rand库来生成随机数,因为这比直接使用getrandom快得多。

所以,对于大多数情况来说,仅仅使用randthread_rng就已经完全足够了;当读者计划使用getrandom时,建议读者最好能够确定自己真的需要它。

原理和细节

getrandom库使用了来自操作系统的接口来生成随机数,具体来说,在Linux上使用getrandomman7.org),在Windows上使用BCryptGenRandomWindows Learn),在macOS上使用getentropyunix.com)。

getrandom库在遇到错误时会优先返回Error,而不是不可信的结果。

getrandom库在系统启动的早期可能会因为操作系统还没有安全地为RNG设置种子而阻塞。

标签:mut,uuid,getrandom,rng,feature,随机数,短小精悍,Rust
From: https://www.cnblogs.com/cinea/p/17932021.html

相关文章

  • Rust爬取大A股票数据.rs
    externcratesimple_excel_writerasexcel;useexcel::*;fnmain()->Result<(),Box<dynstd::error::Error>>{  leturl:&str="http://94.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124040399874179311124_1685159655748&pn......
  • Rust error : usize 类型不能进行 - 操作
    return(-low-1asisize)asisize;cannotapplyunaryoperator-Rust编写程序时候usize类型进行-1运算时报的错误写了下BinarySearch,对于if判断修正为平衡版本,同时解决了取得的midVal已经获取其下标,不必等其缩小完边界。以下是第一种较差的实现方式。fnbinar......
  • Windows 安装 Rust 并设置镜像加速
    目录下载rustup-init.exe(Rust安装工具)使用镜像加速rustup安装安装Rust安装标准库源码使用镜像加速cargo包下载安装结果确认更新、卸载和文档查看参考文档下载rustup-init.exe(Rust安装工具)下载安装程序https://www.rust-lang.org/tools/install,我选的是64位:使用镜像加速rustu......
  • 37. 干货系列从零用Rust编写负载均衡及代理,负载均衡中try_files实现
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • rust call sqlite3 error: linking with `link.exe` failed: exit code: 1181
    rustcallsqlite3error:linkingwithlink.exefailed:exitcode:1181声明:本文禁止csdn.net及所有所有子网站转载。禁止以营利性为目的的转载。报错error:linkingwith`link.exe`failed:exitcode:1181......
  • Windows下使用rust调用SQLite3
    Windows下使用rust调用SQLite3声明:本文禁止csdn.net及所有所有子网站转载。禁止以营利性为目的的转载。userusqlite::{Connection,Result};#[derive(Debug)]structPerson{id:i32,name:String,data:Option<Vec<u8>>,}fnmain()->Result<()>{......
  • rust 过程宏
    简介Rust编程语言里面有两种宏系统,一种是声明宏(DeclarativeMacros),另一种为过程宏(ProceduralMacros)。声明宏和过程宏是两种基本上完全不一样的宏系统,编写的方式也完全不一致,使用方式除了函数式外也不一致。关于声明宏学习,Rust宏小册里面有比较详细的说明,这里不再啰嗦。而对于......
  • cargo-make rust 任务执行以及构建工具
    再学习nakago框架的时候发现其使用了cargo-make这个工具,但是很方便,类似make的构建模式包含的特性依赖管理,别名支持,支持workspace简单使用安装cargoinstall--forcecargo-make参考使用创建一个cargo项目 cargonewappdemoMakefile.toml文件cargonewappdemoMakefile.to......
  • maturin 方便发布基于rust 的python 包工具
    maturin是PyO3团队开发的,方便我们开发基于rust的python包,比如PyO3的使用文档中就使用了此工具安装&使用安装(可选,可以基于venv安装)可以基于pip以及pipxpipxinstallmaturin创建一个简单项目python-mvenv.venvsource.venv/bin/activatepipinstallmaturinmaturin......
  • 短小精悍(2) - Rust终端检测库is-terminal和atty介绍
    title:短小精悍(2)-Rust终端检测库is-terminal和atty介绍zhihu-url:https://zhuanlan.zhihu.com/p/673841498今天给大家介绍的是Rust中非常常用的两个用于检测终端的库is-terminal和atty。这两个库都是千万级别的下载量,大多数和日志、流、交互相关的库都会依赖它们,而我们在......