Random 在Rust中生成安全随机数

Random 在Rust中生成安全随机数,random,rust,rust-obsolete,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); } 但是,我得到的错误类型co

我可以看出我必须这样导入:

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
在名为
next\u u32

但是rust文档清楚地说明了有一个函数
next\u u32


我缺少什么?

您这里的问题是
OsRng::new()
不返回
OsRng
实例,而是返回
IoResult
。因为程序可能无法获取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);
}

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

货舱 梅因 有用的参考资料:


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

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

仅供参考:API在最新版本中已更改,请参阅

TL;DR版本,使用

fn获取\u random\u buf()->结果{
设mut buf=[0u8;32];
getrandom::getrandom(&mutbuf)?;
Ok(buf)
}

正在尝试!(OsRng::new())是否与该匹配语句类似**也许不是,我只是试过了。我犯了一个错误。有什么原因不能直接导入use std::rand:OsRng而不是{OsRng,Rng}?@leshow使用
试试!()
您需要调用函数
OsRng::new()
来返回
IoResult
(这将导致在出现错误时提前返回)。它实际上是一个非常简单的宏:@leshow您需要导入trait
Rng
,才能在
OsRng
上使用它的实现。在您的例子中,方法
next\u u32()
。问题不在于
OsRng::new()
是否返回
IoResult
,而在于调用它的函数。因为作为
尝试扩展为
返回错误(..)
,您的函数必须与之兼容。对于现代锈菌,请使用兰德:{OsRng,Rng}
和兰德板条箱。
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());
}
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
fn get_random_buf() -> Result<[u8; 32], getrandom::Error> {
    let mut buf = [0u8; 32];
    getrandom::getrandom(&mut buf)?;
    Ok(buf)
}