在Rust中生成安全的随机数

7

我可以看到我需要像这样导入:

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

然后创建一个OsRng实例,并尝试从中生成一个新的u32整数。
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的方法。但是Rust文档明确表示有一个函数next_u32http://doc.rust-lang.org/std/rand/struct.OsRng.html 我错过了什么?
3个回答

5
您的问题在于OsRng::new()并不会返回一个OsRng实例,而是一个IoResult<OsRng>。因为程序有可能无法获取操作系统随机数生成器。
一个示例用法如下:
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);
}

2
try!(OsRng::new())和match语句相似吗?也许不是,我刚试了一下,出现了错误。你为什么不能直接导入use std::rand:OsRng而不是{OsRng, Rng}? - leshow
1
@leshow 要使用 try!(),你需要调用 OsRng::new() 函数返回一个 IoResult<_>(它会在错误时提前返回)。实际上,这是一个非常简单的宏:http://doc.rust-lang.org/std/macro.try!.html - Levans
1
问题不在于 OsRng::new() 是否返回 IoResult,而在于调用它的函数。因为 try! 展开为 return Err(..),所以您的函数必须与之兼容。 - Levans
如何使我的函数兼容,以便我可以使用try!()?只是出于好奇的目的 - leshow
4
对于现代 Rust,请使用 rand crate 中的 use rand::{OsRng, Rng} - Ben Ruijl
显示剩余2条评论

3

2

在 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接