在Rust中生成安全随机数

时间:2014-12-08 16:35:48

标签: random rust rust-obsolete

我可以看到我必须像这样导入:

use std::io::IoResult;
use std::num::{Int, ToPrimitive};
use std::rand::{OsRng, Rng};

然后创建一个新的OsRng实例,并尝试从中生成一个新的u32 int

fn main() {

  let mut rng = OsRng::new();

  let num:u32 = rng.next_u32();
  println!("{}",num);
}

但是我得到错误类型core::result::Result<std::rand::os::imp::OsRng, std::io::IoError>没有实现名为next_u32的范围内的任何方法

但是锈迹文件明确说明有一个函数next_u32http://doc.rust-lang.org/std/rand/struct.OsRng.html

我错过了什么?

3 个答案:

答案 0 :(得分:5)

您的问题是,OsRng::new()不会返回OsRng个实例,而是IoResult<OsRng>。因为程序无法获取OS随机数生成器。

示例用法是:

use std::rand::{OsRng, Rng};

fn main() {

    let mut rng = match OsRng::new() {
        Ok(g) => g,
        Err(e) => panic!("Failed to obtain OS RNG: {}", e)
    };

    let num:u32 = rng.next_u32();
    println!("{}",num);
}

答案 1 :(得分:1)

在Rust上搜索生成安全随机数返回了这个问题,但作为对当前答案状态的评论,Rust不再包括标准库中的随机数生成。这是一个更新的示例(截至2017年1月):

Cargo.toml

[dependencies]
rand = "0.3.0"

main.rs

extern crate rand;
use rand::{OsRng, Rng};

fn main() {
    let mut rng = OsRng::new().expect("Error opening random number generator");
    println!("Random: {}", rng.next_u32());
}

有用的参考:https://doc.rust-lang.org/rand/rand/index.html#cryptographic-security

否则,使用原始答案中的代码会出现此错误:

error[E0432]: unresolved import `std::rand::Rng`
 --> src/main.rs:5:24
  |
5 | use std::rand::{OsRng, Rng};
  |                        ^^^ no `Rng` in `std::rand`

error: module `rand` is private
 --> src/main.rs:5:17
  |
5 | use std::rand::{OsRng, Rng};
  |                 ^^^^^

error: module `rand` is private
 --> src/main.rs:5:24
  |
5 | use std::rand::{OsRng, Rng};
  |                        ^^^

error: aborting due to 3 previous errors

答案 2 :(得分:0)

仅供参考:API已更改为最新版本,请参见https://rust-random.github.io/book/update-0.7.html

TL; DR版本,使用https://github.com/rust-random/getrandom

fn get_random_buf() -> Result<[u8; 32], getrandom::Error> {
    let mut buf = [0u8; 32];
    getrandom::getrandom(&mut buf)?;
    Ok(buf)
}