首页 文章

在Rust中生成安全随机数

提问于
浏览
2

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

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

我错过了什么?

2 回答

  • 0

    这里你的问题是 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);
    }
    
  • 5

    在Rust上搜索生成安全随机数返回了这个SO问题,但作为对当前答案状态的评论,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
    

相关问题